diff options
author | Pawel "l0ner" Soltys <pwslts@gmail.com> | 2012-02-02 14:23:19 +0100 |
---|---|---|
committer | Pawel "l0ner" Soltys <pwslts@gmail.com> | 2012-02-02 14:23:19 +0100 |
commit | ed2b6731ab373ac335fde87af177351facbd2f15 (patch) | |
tree | 81cc3d45c8c30aceadb4f597be819dc2863a3a3a /opensuse/core/tdebase | |
parent | 021036598a306d8cf7204d6d62ff090278f7ecf1 (diff) | |
parent | 5f93960dbb108c2c6d09964d1ee0d2e390b1498c (diff) | |
download | tde-packaging-ed2b6731ab373ac335fde87af177351facbd2f15.tar.gz tde-packaging-ed2b6731ab373ac335fde87af177351facbd2f15.zip |
Merge branch 'master' of http://scm.trinitydesktop.org/scm/git/tde-packaging
Diffstat (limited to 'opensuse/core/tdebase')
157 files changed, 37836 insertions, 0 deletions
diff --git a/opensuse/core/tdebase/.project b/opensuse/core/tdebase/.project new file mode 100644 index 000000000..27414a33c --- /dev/null +++ b/opensuse/core/tdebase/.project @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>tdebase</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + </buildSpec> + <natures> + <nature>org.eclipse.linuxtools.rpm.core.rpmnature</nature> + </natures> +</projectDescription> diff --git a/opensuse/core/tdebase/3_5_BRANCH.diff b/opensuse/core/tdebase/3_5_BRANCH.diff new file mode 100644 index 000000000..bff4be17d --- /dev/null +++ b/opensuse/core/tdebase/3_5_BRANCH.diff @@ -0,0 +1,1176 @@ +package: kdebase-3.5.10.tar.bz2 +kdemod: kdebase +Index: BRANCH_STATUS +=================================================================== +--- /dev/null ++++ BRANCH_STATUS +@@ -0,0 +1,2 @@ ++current HEAD: 865247 ++svn di between //tags/KDE/3.5.10/kdebase and //branches/KDE/3.5/kdebase +Index: kcontrol/background/bgrender.cpp +=================================================================== +--- kcontrol/background/bgrender.cpp.orig ++++ kcontrol/background/bgrender.cpp +@@ -1163,9 +1163,8 @@ void KVirtualBGRenderer::desktopResized( + m_pPixmap = new QPixmap(m_size); + m_pPixmap->fill(Qt::black); + } +- +- for (unsigned i=0; i<m_numRenderers; ++i) +- m_renderer[i]->desktopResized(); ++ ++ initRenderers(); + } + + +Index: kcontrol/info/opengl.cpp +=================================================================== +--- kcontrol/info/opengl.cpp.orig ++++ kcontrol/info/opengl.cpp +@@ -608,7 +608,6 @@ static QListViewItem *get_gl_info(Displa + } + else { + kdDebug() << "Error: glXMakeCurrent failed\n"; +- glXDestroyContext(dpy, ctx); + } + + glXDestroyContext(dpy, ctx); +Index: kicker/taskbar/taskbar.cpp +=================================================================== +--- kicker/taskbar/taskbar.cpp.orig ++++ kicker/taskbar/taskbar.cpp +@@ -61,8 +61,6 @@ TaskBar::TaskBar( QWidget *parent, const + m_textShadowEngine(0), + m_ignoreUpdates(false) + { +- setFrameStyle( NoFrame ); +- + arrowType = LeftArrow; + blocklayout = true; + +@@ -81,6 +79,8 @@ TaskBar::TaskBar( QWidget *parent, const + connect(&m_relayoutTimer, SIGNAL(timeout()), + this, SLOT(reLayout())); + ++ connect(this, SIGNAL(contentsMoving(int, int)), SLOT(setBackground())); ++ + // connect manager + connect(TaskManager::the(), SIGNAL(taskAdded(Task::Ptr)), + this, SLOT(add(Task::Ptr))); +@@ -647,7 +647,7 @@ void TaskBar::reLayoutEventually() + + if (!blocklayout && !m_ignoreUpdates) + { +- m_relayoutTimer.start(100, true); ++ m_relayoutTimer.start(25, true); + } + } + +@@ -814,24 +814,16 @@ void TaskBar::reLayout() + QTimer::singleShot(100, this, SLOT(publishIconGeometry())); + } + +-void TaskBar::viewportResizeEvent( QResizeEvent* e ) +-{ +- Panner::viewportResizeEvent(e); +- setViewportBackground(); +-} +- + void TaskBar::setViewportBackground() + { + const QPixmap *bg = parentWidget()->backgroundPixmap(); + +- viewport()->unsetPalette(); +- + if (bg) + { + QPixmap pm(parentWidget()->size()); + pm.fill(parentWidget(), pos() + viewport()->pos()); + viewport()->setPaletteBackgroundPixmap(pm); +- viewport()->setBackgroundOrigin( WidgetOrigin ); ++ viewport()->setBackgroundOrigin(WidgetOrigin); + } + else + viewport()->setPaletteBackgroundColor(paletteBackgroundColor()); +Index: kicker/taskbar/taskbar.h +=================================================================== +--- kicker/taskbar/taskbar.h.orig ++++ kicker/taskbar/taskbar.h +@@ -63,12 +63,11 @@ public: + + QImage* blendGradient(const QSize& size); + +- void setBackground(); +- + KTextShadowEngine *textShadowEngine(); + + public slots: + void configure(); ++ void setBackground(); + + signals: + void containerCountChanged(); +@@ -98,7 +97,6 @@ protected: + void viewportMouseReleaseEvent( QMouseEvent* ); + void viewportMouseDoubleClickEvent( QMouseEvent* ); + void viewportMouseMoveEvent( QMouseEvent* ); +- void viewportResizeEvent( QResizeEvent * ); + void wheelEvent(QWheelEvent*); + void propagateMouseEvent( QMouseEvent* ); + void resizeEvent( QResizeEvent* ); +Index: kicker/libkicker/panner.cpp +=================================================================== +--- kicker/libkicker/panner.cpp.orig ++++ kicker/libkicker/panner.cpp +@@ -35,28 +35,28 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include "panner.h" + #include "panner.moc" + +- + Panner::Panner( QWidget* parent, const char* name ) +- : QScrollView( parent, name ), ++ : QWidget( parent, name ), + _luSB(0), +- _rdSB(0) ++ _rdSB(0), ++ _cwidth(0), _cheight(0), ++ _cx(0), _cy(0) + { + KGlobal::locale()->insertCatalogue("libkicker"); + setBackgroundOrigin( AncestorOrigin ); + + _updateScrollButtonsTimer = new QTimer(this); + connect(_updateScrollButtonsTimer, SIGNAL(timeout()), this, SLOT(reallyUpdateScrollButtons())); +- +- setResizePolicy(Manual); +- setVScrollBarMode( QScrollView::AlwaysOff ); +- setHScrollBarMode( QScrollView::AlwaysOff ); +- +- viewport()->setBackgroundMode( PaletteBackground ); +- viewport()->setBackgroundOrigin( AncestorOrigin ); + ++ _clipper = new QWidget(this); ++ _clipper->setBackgroundOrigin(AncestorOrigin); ++ _clipper->installEventFilter( this ); ++ _viewport = new QWidget(_clipper); ++ _viewport->setBackgroundOrigin(AncestorOrigin); ++ + // layout + _layout = new QBoxLayout(this, QBoxLayout::LeftToRight); +- _layout->addWidget(viewport(), 1); ++ _layout->addWidget(_clipper, 1); + setOrientation(Horizontal); + } + +@@ -64,6 +64,37 @@ Panner::~Panner() + { + } + ++void Panner::createScrollButtons() ++{ ++ if (_luSB) ++ { ++ return; ++ } ++ ++ // left/up scroll button ++ _luSB = new SimpleArrowButton(this); ++ _luSB->installEventFilter(this); ++ //_luSB->setAutoRepeat(true); ++ _luSB->setMinimumSize(12, 12); ++ _luSB->hide(); ++ _layout->addWidget(_luSB); ++ connect(_luSB, SIGNAL(pressed()), SLOT(startScrollLeftUp())); ++ connect(_luSB, SIGNAL(released()), SLOT(stopScroll())); ++ ++ // right/down scroll button ++ _rdSB = new SimpleArrowButton(this); ++ _rdSB->installEventFilter(this); ++ //_rdSB->setAutoRepeat(true); ++ _rdSB->setMinimumSize(12, 12); ++ _rdSB->hide(); ++ _layout->addWidget(_rdSB); ++ connect(_rdSB, SIGNAL(pressed()), SLOT(startScrollRightDown())); ++ connect(_rdSB, SIGNAL(released()), SLOT(stopScroll())); ++ ++ // set up the buttons ++ setupButtons(); ++} ++ + void Panner::setupButtons() + { + if (orientation() == Horizontal) +@@ -110,55 +141,54 @@ void Panner::setOrientation(Orientation + reallyUpdateScrollButtons(); + } + +-void Panner::resizeEvent( QResizeEvent* e ) ++void Panner::resizeEvent( QResizeEvent* ) + { +- QScrollView::resizeEvent( e ); +- updateScrollButtons(); ++ //QScrollView::resizeEvent( e ); ++ //updateScrollButtons(); + } + + void Panner::scrollRightDown() + { + if(orientation() == Horizontal) // scroll right +- scrollBy( 40, 0 ); ++ scrollBy( _step, 0 ); + else // scroll down +- scrollBy( 0, 40 ); ++ scrollBy( 0, _step ); ++ if (_step < 64) ++ _step++; + } + + void Panner::scrollLeftUp() + { + if(orientation() == Horizontal) // scroll left +- scrollBy( -40, 0 ); ++ scrollBy( -_step, 0 ); + else // scroll up +- scrollBy( 0, -40 ); ++ scrollBy( 0, -_step ); ++ if (_step < 64) ++ _step++; + } + +-void Panner::createScrollButtons() ++void Panner::startScrollRightDown() + { +- if (_luSB) +- { +- return; +- } +- +- // left/up scroll button +- _luSB = new SimpleArrowButton(this); +- _luSB->installEventFilter(this); +- _luSB->setAutoRepeat(true); +- _luSB->setMinimumSize(12, 12); +- _luSB->hide(); +- _layout->addWidget(_luSB); +- connect(_luSB, SIGNAL(clicked()), SLOT(scrollLeftUp())); ++ _scrollTimer = new QTimer(this); ++ connect(_scrollTimer, SIGNAL(timeout()), SLOT(scrollRightDown())); ++ _scrollTimer->start(50); ++ _step = 8; ++ scrollRightDown(); ++} + +- // right/down scroll button +- _rdSB = new SimpleArrowButton(this); +- _rdSB->installEventFilter(this); +- _rdSB->setAutoRepeat(true); +- _rdSB->setMinimumSize(12, 12); +- _rdSB->hide(); +- _layout->addWidget(_rdSB); +- connect(_rdSB, SIGNAL(clicked()), SLOT(scrollRightDown())); ++void Panner::startScrollLeftUp() ++{ ++ _scrollTimer = new QTimer(this); ++ connect(_scrollTimer, SIGNAL(timeout()), SLOT(scrollLeftUp())); ++ _scrollTimer->start(50); ++ _step = 8; ++ scrollLeftUp(); ++} + +- // set up the buttons +- setupButtons(); ++void Panner::stopScroll() ++{ ++ delete _scrollTimer; ++ _scrollTimer = 0; + } + + void Panner::reallyUpdateScrollButtons() +@@ -176,7 +206,7 @@ void Panner::reallyUpdateScrollButtons() + delta = contentsHeight() - height(); + } + +- if (delta > 1) ++ if (delta >= 1) + { + createScrollButtons(); + +@@ -184,21 +214,11 @@ void Panner::reallyUpdateScrollButtons() + // we need to do this every single time + _luSB->show(); + _rdSB->show(); +- +- if (orientation() == Horizontal) +- { +- setMargins(0, 0, _luSB->width() + _rdSB->width(), 0); +- } +- else +- { +- setMargins(0, 0, 0, _luSB->height() + _rdSB->height()); +- } + } + else if (_luSB && _luSB->isVisibleTo(this)) + { + _luSB->hide(); + _rdSB->hide(); +- setMargins(0, 0, 0, 0); + } + } + +@@ -207,8 +227,170 @@ void Panner::updateScrollButtons() + _updateScrollButtonsTimer->start(200, true); + } + ++void Panner::setContentsPos(int x, int y) ++{ ++ if (x < 0) ++ x = 0; ++ else if (x > (contentsWidth() - visibleWidth())) ++ x = contentsWidth() - visibleWidth(); ++ ++ if (y < 0) ++ y = 0; ++ else if (y > (contentsHeight() - visibleHeight())) ++ y = contentsHeight() - visibleHeight(); ++ ++ if (x == contentsX() && y == contentsY()) ++ return; ++ ++ _viewport->move(-x, -y); ++ emit contentsMoving(x, y); ++} ++ ++void Panner::scrollBy(int dx, int dy) ++{ ++ setContentsPos(contentsX() + dx, contentsY() + dy); ++} ++ + void Panner::resizeContents( int w, int h ) + { +- QScrollView::resizeContents( w, h ); ++ _viewport->resize(w, h); ++ setContentsPos(contentsX(), contentsY()); + updateScrollButtons(); + } ++ ++QPoint Panner::contentsToViewport( const QPoint& p ) const ++{ ++ return QPoint(p.x() - contentsX() - _clipper->x(), p.y() - contentsY() - _clipper->y()); ++} ++ ++QPoint Panner::viewportToContents( const QPoint& vp ) const ++{ ++ return QPoint(vp.x() + contentsX() + _clipper->x(), vp.y() + contentsY() + _clipper->y()); ++} ++ ++void Panner::contentsToViewport( int x, int y, int& vx, int& vy ) const ++{ ++ const QPoint v = contentsToViewport(QPoint(x,y)); ++ vx = v.x(); ++ vy = v.y(); ++} ++ ++void Panner::viewportToContents( int vx, int vy, int& x, int& y ) const ++{ ++ const QPoint c = viewportToContents(QPoint(vx,vy)); ++ x = c.x(); ++ y = c.y(); ++} ++ ++void Panner::ensureVisible( int x, int y ) ++{ ++ ensureVisible(x, y, 50, 50); ++} ++ ++void Panner::ensureVisible( int x, int y, int xmargin, int ymargin ) ++{ ++ int pw=visibleWidth(); ++ int ph=visibleHeight(); ++ ++ int cx=-contentsX(); ++ int cy=-contentsY(); ++ int cw=contentsWidth(); ++ int ch=contentsHeight(); ++ ++ if ( pw < xmargin*2 ) ++ xmargin=pw/2; ++ if ( ph < ymargin*2 ) ++ ymargin=ph/2; ++ ++ if ( cw <= pw ) { ++ xmargin=0; ++ cx=0; ++ } ++ if ( ch <= ph ) { ++ ymargin=0; ++ cy=0; ++ } ++ ++ if ( x < -cx+xmargin ) ++ cx = -x+xmargin; ++ else if ( x >= -cx+pw-xmargin ) ++ cx = -x+pw-xmargin; ++ ++ if ( y < -cy+ymargin ) ++ cy = -y+ymargin; ++ else if ( y >= -cy+ph-ymargin ) ++ cy = -y+ph-ymargin; ++ ++ if ( cx > 0 ) ++ cx=0; ++ else if ( cx < pw-cw && cw>pw ) ++ cx=pw-cw; ++ ++ if ( cy > 0 ) ++ cy=0; ++ else if ( cy < ph-ch && ch>ph ) ++ cy=ph-ch; ++ ++ setContentsPos( -cx, -cy ); ++} ++ ++bool Panner::eventFilter( QObject *obj, QEvent *e ) ++{ ++ if ( obj == _viewport || obj == _clipper ) ++ { ++ switch ( e->type() ) ++ { ++ case QEvent::Resize: ++ viewportResizeEvent((QResizeEvent *)e); ++ break; ++ case QEvent::MouseButtonPress: ++ viewportMousePressEvent( (QMouseEvent*)e ); ++ if ( ((QMouseEvent*)e)->isAccepted() ) ++ return true; ++ break; ++ case QEvent::MouseButtonRelease: ++ viewportMouseReleaseEvent( (QMouseEvent*)e ); ++ if ( ((QMouseEvent*)e)->isAccepted() ) ++ return true; ++ break; ++ case QEvent::MouseButtonDblClick: ++ viewportMouseDoubleClickEvent( (QMouseEvent*)e ); ++ if ( ((QMouseEvent*)e)->isAccepted() ) ++ return true; ++ break; ++ case QEvent::MouseMove: ++ viewportMouseMoveEvent( (QMouseEvent*)e ); ++ if ( ((QMouseEvent*)e)->isAccepted() ) ++ return true; ++ break; ++ default: ++ break; ++ } ++ } ++ ++ return QWidget::eventFilter( obj, e ); // always continue with standard event processing ++} ++ ++void Panner::viewportResizeEvent( QResizeEvent* ) ++{ ++} ++ ++void Panner::viewportMousePressEvent( QMouseEvent* e) ++{ ++ e->ignore(); ++} ++ ++void Panner::viewportMouseReleaseEvent( QMouseEvent* e ) ++{ ++ e->ignore(); ++} ++ ++void Panner::viewportMouseDoubleClickEvent( QMouseEvent* e ) ++{ ++ e->ignore(); ++} ++ ++void Panner::viewportMouseMoveEvent( QMouseEvent* e ) ++{ ++ e->ignore(); ++} +Index: kicker/libkicker/panner.h +=================================================================== +--- kicker/libkicker/panner.h.orig ++++ kicker/libkicker/panner.h +@@ -24,14 +24,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #ifndef __panner_h__ + #define __panner_h__ + +-#include <qscrollview.h> ++#include <qwidget.h> + + #include "simplebutton.h" + + class QBoxLayout; + class QTimer; + +-class KDE_EXPORT Panner : public QScrollView ++class KDE_EXPORT Panner : public QWidget + { + Q_OBJECT + +@@ -43,17 +43,55 @@ public: + + Qt::Orientation orientation() const { return _orient; } + virtual void setOrientation(Orientation orientation); ++ ++ QWidget *viewport() const { return _viewport; } ++ ++ QRect contentsRect() const { return QRect(0, 0, width(), height()); } ++ ++ int contentsX() const { return _viewport ? -_viewport->x() : 0; } ++ int contentsY() const { return _viewport ? -_viewport->y() : 0; } ++ int contentsWidth() const { return _viewport ? _viewport->width() : 0; } ++ int contentsHeight() const { return _viewport ? _viewport->height() : 0; } ++ void setContentsPos(int x, int y); ++ ++ int visibleWidth() const { return _clipper->width(); } ++ int visibleHeight() const { return _clipper->height(); } ++ ++ void contentsToViewport( int x, int y, int& vx, int& vy ) const; ++ void viewportToContents( int vx, int vy, int& x, int& y ) const; ++ QPoint contentsToViewport( const QPoint& ) const; ++ QPoint viewportToContents( const QPoint& ) const; ++ ++ void addChild(QWidget *child) { child->show(); } ++ void removeChild(QWidget *child) { child->hide(); } ++ int childX(QWidget *child) const { return child->x(); } ++ int childY(QWidget *child) const { return child->y(); } ++ void moveChild(QWidget *child, int x, int y) { child->move(x, y); } ++ ++ void ensureVisible( int x, int y ); ++ void ensureVisible( int x, int y, int xmargin, int ymargin ); + + public slots: + virtual void resizeContents( int w, int h ); ++ void startScrollRightDown(); ++ void startScrollLeftUp(); ++ void stopScroll(); + void scrollRightDown(); + void scrollLeftUp(); + void reallyUpdateScrollButtons(); ++ void scrollBy(int dx, int dy); ++ ++signals: ++ void contentsMoving(int x, int y); + + protected: +- void resizeEvent(QResizeEvent *ev); +- void contentsWheelEvent(QWheelEvent *){;} +- void viewportWheelEvent(QWheelEvent *){;} ++ virtual bool eventFilter( QObject *obj, QEvent *e ); ++ virtual void resizeEvent(QResizeEvent *ev); ++ virtual void viewportResizeEvent( QResizeEvent* ); ++ virtual void viewportMousePressEvent( QMouseEvent* ); ++ virtual void viewportMouseReleaseEvent( QMouseEvent* ); ++ virtual void viewportMouseDoubleClickEvent( QMouseEvent* ); ++ virtual void viewportMouseMoveEvent( QMouseEvent* ); + + private: + void setupButtons(); +@@ -65,6 +103,13 @@ private: + SimpleArrowButton *_luSB; // Left Scroll Button + SimpleArrowButton *_rdSB; // Right Scroll Button + QTimer *_updateScrollButtonsTimer; ++ QTimer *_scrollTimer; ++ ++ QWidget *_clipper; ++ QWidget *_viewport; ++ int _cwidth, _cheight; ++ int _cx, _cy; ++ int _step; + }; + + #endif +Index: kicker/extensions/taskbar/taskbarextension.cpp +=================================================================== +--- kicker/extensions/taskbar/taskbarextension.cpp.orig ++++ kicker/extensions/taskbar/taskbarextension.cpp +@@ -170,7 +170,6 @@ void TaskBarExtension::setBackgroundThem + } + + unsetPalette(); +- m_container->unsetPalette(); + + if (KickerSettings::useBackgroundTheme()) + { +@@ -215,17 +214,17 @@ void TaskBarExtension::setBackgroundThem + KickerLib::colorize(bgImage); + } + setPaletteBackgroundPixmap(bgImage); +- m_container->setPaletteBackgroundPixmap(bgImage); + } + } ++ ++ m_container->setBackground(); + } + + void TaskBarExtension::updateBackground(const QPixmap& bgImage) + { + unsetPalette(); + setPaletteBackgroundPixmap(bgImage); +- m_container->unsetPalette(); +- m_container->setPaletteBackgroundPixmap(bgImage); ++ m_container->setBackground(); + } + + void TaskBarExtension::resizeEvent(QResizeEvent *e) +Index: kicker/kicker/core/container_extension.cpp +=================================================================== +--- kicker/kicker/core/container_extension.cpp.orig ++++ kicker/kicker/core/container_extension.cpp +@@ -126,6 +126,7 @@ void ExtensionContainer::init() + connect(Kicker::the()->kwinModule(), SIGNAL(currentDesktopChanged(int)), + this, SLOT( currentDesktopChanged(int))); + ++ setBackgroundOrigin(AncestorOrigin); + setFrameStyle(NoFrame); + setLineWidth(0); + setMargin(0); +@@ -163,7 +164,7 @@ void ExtensionContainer::init() + { + _userHidden = static_cast<UserHidden>(tmp); + } +- ++ + if (m_extension) + { + // if we have an extension, we need to grab the extension-specific +Index: kicker/kicker/core/containerarea.cpp +=================================================================== +--- kicker/kicker/core/containerarea.cpp.orig ++++ kicker/kicker/core/containerarea.cpp +@@ -90,15 +90,12 @@ ContainerArea::ContainerArea(KConfig* _c + m_addAppletDialog(0) + { + setBackgroundOrigin( WidgetOrigin ); +- viewport()->setBackgroundOrigin( AncestorOrigin ); + +- m_contents = new QWidget(viewport()); +- m_contents->setBackgroundOrigin(AncestorOrigin); ++ m_contents = viewport(); + + m_layout = new ContainerAreaLayout(m_contents); + +- // Install an event filter to propagate layout hints coming from +- // m_contents. ++ // Install an event filter to propagate layout hints coming from m_contents. + m_contents->installEventFilter(this); + + setBackground(); +Index: kicker/kicker/core/panelextension.cpp +=================================================================== +--- kicker/kicker/core/panelextension.cpp.orig ++++ kicker/kicker/core/panelextension.cpp +@@ -74,7 +74,6 @@ PanelExtension::PanelExtension(const QSt + connect(_containerArea, SIGNAL(maintainFocus(bool)), this, SIGNAL(maintainFocus(bool))); + _layout->addWidget(_containerArea); + +- _containerArea->setFrameStyle(QFrame::NoFrame); + _containerArea->viewport()->installEventFilter(this); + _containerArea->configure(); + +Index: kicker/applets/systemtray/systemtrayapplet.h +=================================================================== +--- kicker/applets/systemtray/systemtrayapplet.h.orig ++++ kicker/applets/systemtray/systemtrayapplet.h +@@ -118,6 +118,7 @@ public: + TrayEmbed( bool kdeTray, QWidget* parent = NULL ); + bool kdeTray() const { return kde_tray; } + void setBackground(); ++ void getIconSize(int defaultIconSize); + private: + bool kde_tray; + }; +Index: kicker/applets/systemtray/systemtrayapplet.cpp +=================================================================== +--- kicker/applets/systemtray/systemtrayapplet.cpp.orig ++++ kicker/applets/systemtray/systemtrayapplet.cpp +@@ -54,6 +54,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE + + #include <X11/Xlib.h> + ++#define ICON_MARGIN 1 ++ + extern "C" + { + KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile) +@@ -459,9 +461,9 @@ void SystemTrayApplet::embedWindow( WId + delete emb; + return; + } +- ++ + connect(emb, SIGNAL(embeddedWindowDestroyed()), SLOT(updateTrayWindows())); +- emb->setMinimumSize(m_iconSize, m_iconSize); ++ emb->getIconSize(m_iconSize); + + if (shouldHide(w)) + { +@@ -471,7 +473,7 @@ void SystemTrayApplet::embedWindow( WId + } + else + { +- emb->hide(); ++ //emb->hide(); + emb->setBackground(); + emb->show(); + m_shownWins.append(emb); +@@ -515,7 +517,7 @@ void SystemTrayApplet::updateVisibleWins + { + for (; emb != lastEmb; ++emb) + { +- (*emb)->hide(); ++ //(*emb)->hide(); + (*emb)->setBackground(); + (*emb)->show(); + } +@@ -744,8 +746,7 @@ int SystemTrayApplet::widthForHeight(int + } + + int currentHeight = height(); +- int minHeight = m_iconSize + 4; +- if (currentHeight != h && currentHeight != minHeight) ++ if (currentHeight != h) + { + SystemTrayApplet* me = const_cast<SystemTrayApplet*>(this); + me->setMinimumSize(0, 0); +@@ -764,8 +765,7 @@ int SystemTrayApplet::heightForWidth(int + } + + int currentWidth = width(); +- int minSize = m_iconSize + 4; +- if (currentWidth != w && currentWidth != minSize) ++ if (currentWidth != w) + { + SystemTrayApplet* me = const_cast<SystemTrayApplet*>(this); + me->setMinimumSize(0, 0); +@@ -782,10 +782,8 @@ void SystemTrayApplet::moveEvent( QMoveE + } + + +-void SystemTrayApplet::resizeEvent( QResizeEvent* e ) ++void SystemTrayApplet::resizeEvent( QResizeEvent* ) + { +- KPanelApplet::resizeEvent(e); +- + layoutTray(); + // we need to give ourselves a chance to adjust our size before calling this + QTimer::singleShot(0, this, SIGNAL(updateLayout())); +@@ -808,7 +806,7 @@ void SystemTrayApplet::layoutTray() + int i = 0, line, nbrOfLines, heightWidth; + bool showExpandButton = m_expandButton && m_expandButton->isVisibleTo(this); + delete m_layout; +- m_layout = new QGridLayout(this, 1, 1, 2, 2); ++ m_layout = new QGridLayout(this, 1, 1, ICON_MARGIN, ICON_MARGIN); + + if (m_expandButton) + { +@@ -828,18 +826,18 @@ void SystemTrayApplet::layoutTray() + + // + // The margin and spacing specified in the layout implies that: +- // [-- 2 pixels --] [-- first icon --] [-- 2 pixels --] ... [-- 2 pixels --] [-- last icon --] [-- 2 pixels --] ++ // [-- ICON_MARGIN pixels --] [-- first icon --] [-- ICON_MARGIN pixels --] ... [-- ICON_MARGIN pixels --] [-- last icon --] [-- ICON_MARGIN pixels --] + // +- // So, if we say that iconWidth is the icon width plus the 2 pixels spacing, then the available width for the icons +- // is the widget width minus 2 pixels margin. Forgetting these 2 pixels broke the layout algorithm in KDE <= 3.5.9. ++ // So, if we say that iconWidth is the icon width plus the ICON_MARGIN pixels spacing, then the available width for the icons ++ // is the widget width minus ICON_MARGIN pixels margin. Forgetting these ICON_MARGIN pixels broke the layout algorithm in KDE <= 3.5.9. + // +- // This fix makes the workaround in the heightForWidth() and widthForHeight() methods unneeded. ++ // This fix makes the workarounds in the heightForWidth() and widthForHeight() methods unneeded. + // + + if (orientation() == Vertical) + { +- int iconWidth = maxIconWidth() + 2; // +2 for the margins that implied by the layout +- heightWidth = width() - 2; ++ int iconWidth = maxIconWidth() + ICON_MARGIN; // +2 for the margins that implied by the layout ++ heightWidth = width() - ICON_MARGIN; + // to avoid nbrOfLines=0 we ensure heightWidth >= iconWidth! + heightWidth = heightWidth < iconWidth ? iconWidth : heightWidth; + nbrOfLines = heightWidth / iconWidth; +@@ -860,12 +858,12 @@ void SystemTrayApplet::layoutTray() + emb != lastEmb; ++emb) + { + line = i % nbrOfLines; +- (*emb)->hide(); ++ //(*emb)->hide(); + (*emb)->show(); + m_layout->addWidget(*emb, col, line, + Qt::AlignHCenter | Qt::AlignVCenter); + +- if (line + 1 == nbrOfLines) ++ if ((line + 1) == nbrOfLines) + { + ++col; + } +@@ -879,12 +877,12 @@ void SystemTrayApplet::layoutTray() + emb != lastEmb; ++emb) + { + line = i % nbrOfLines; +- (*emb)->hide(); ++ //(*emb)->hide(); + (*emb)->show(); + m_layout->addWidget(*emb, col, line, + Qt::AlignHCenter | Qt::AlignVCenter); + +- if (line + 1 == nbrOfLines) ++ if ((line + 1) == nbrOfLines) + { + ++col; + } +@@ -894,8 +892,8 @@ void SystemTrayApplet::layoutTray() + } + else // horizontal + { +- int iconHeight = maxIconHeight() + 2; // +2 for the margins that implied by the layout +- heightWidth = height() - 2; ++ int iconHeight = maxIconHeight() + ICON_MARGIN; // +2 for the margins that implied by the layout ++ heightWidth = height() - ICON_MARGIN; + heightWidth = heightWidth < iconHeight ? iconHeight : heightWidth; // to avoid nbrOfLines=0 + nbrOfLines = heightWidth / iconHeight; + +@@ -914,12 +912,12 @@ void SystemTrayApplet::layoutTray() + for (TrayEmbedList::const_iterator emb = m_hiddenWins.begin(); emb != lastEmb; ++emb) + { + line = i % nbrOfLines; +- (*emb)->hide(); ++ //(*emb)->hide(); + (*emb)->show(); + m_layout->addWidget(*emb, line, col, + Qt::AlignHCenter | Qt::AlignVCenter); + +- if (line + 1 == nbrOfLines) ++ if ((line + 1) == nbrOfLines) + { + ++col; + } +@@ -933,12 +931,12 @@ void SystemTrayApplet::layoutTray() + emb != lastEmb; ++emb) + { + line = i % nbrOfLines; +- (*emb)->hide(); ++ //(*emb)->hide(); + (*emb)->show(); + m_layout->addWidget(*emb, line, col, + Qt::AlignHCenter | Qt::AlignVCenter); + +- if (line + 1 == nbrOfLines) ++ if ((line + 1) == nbrOfLines) + { + ++col; + } +@@ -975,6 +973,21 @@ TrayEmbed::TrayEmbed( bool kdeTray, QWid + : QXEmbed( parent ), kde_tray( kdeTray ) + { + hide(); ++} ++ ++void TrayEmbed::getIconSize(int defaultIconSize) ++{ ++ QSize minSize = minimumSizeHint(); ++ ++ int width = minSize.width(); ++ int height = minSize.height(); ++ ++ if (width < 1 || width > defaultIconSize) ++ width = defaultIconSize; ++ if (height < 1 || height > defaultIconSize) ++ height = defaultIconSize; ++ ++ setFixedSize(width, height); + setBackground(); + } + +@@ -994,9 +1007,7 @@ void TrayEmbed::setBackground() + + if (!isHidden()) + { +- hide(); +- show(); ++ XClearArea(x11Display(), embeddedWinId(), 0, 0, 0, 0, True); + } +- //XClearArea(x11Display(), embeddedWinId(), 0, 0, 0, 0, True); + } + +Index: kicker/applets/clock/clock.h +=================================================================== +--- kicker/applets/clock/clock.h.orig ++++ kicker/applets/clock/clock.h +@@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + + #include <kickertip.h> + #include "settings.h" ++#include "kshadowengine.h" + + class QTimer; + class QBoxLayout; +@@ -152,6 +153,9 @@ class PlainClock : public QLabel, public + bool showDayOfWeek(); + + protected: ++ void paintEvent(QPaintEvent *e); ++ void drawContents(QPainter *p); ++ + QString _timeStr; + }; + +@@ -279,6 +283,8 @@ class ClockApplet : public KPanelApplet, + QDate clockGetDate(); + + virtual void updateKickerTip(KickerTip::Data&); ++ ++ KTextShadowEngine *shadowEngine(); + + k_dcop: + void reconfigure(); +@@ -335,6 +341,7 @@ class ClockApplet : public KPanelApplet, + QStringList _remotezonelist; + KPopupMenu* menu; + ClockAppletToolTip m_tooltip; ++ KTextShadowEngine *m_shadowEngine; + }; + + +Index: kicker/applets/clock/Makefile.am +=================================================================== +--- kicker/applets/clock/Makefile.am.orig ++++ kicker/applets/clock/Makefile.am +@@ -1,7 +1,7 @@ + pic_DATA = lcd.png + picdir = $(kde_datadir)/clockapplet/pics + +-INCLUDES = -I$(top_srcdir)/kicker/libkicker $(all_includes) ++INCLUDES = -I$(top_srcdir)/kicker/libkicker -I../../libkicker $(all_includes) + + kde_module_LTLIBRARIES = clock_panelapplet.la + +Index: kicker/applets/clock/clock.cpp +=================================================================== +--- kicker/applets/clock/clock.cpp.orig ++++ kicker/applets/clock/clock.cpp +@@ -57,6 +57,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + + #include <global.h> // libkickermain + ++#include "kickerSettings.h" + #include "clock.h" + #include "datepicker.h" + #include "zone.h" +@@ -219,6 +220,7 @@ ClockWidget::~ClockWidget() + PlainClock::PlainClock(ClockApplet *applet, Prefs *prefs, QWidget *parent, const char *name) + : QLabel(parent, name), ClockWidget(applet, prefs) + { ++ setWFlags(WNoAutoErase); + setBackgroundOrigin(AncestorOrigin); + loadSettings(); + updateClock(); +@@ -228,7 +230,7 @@ PlainClock::PlainClock(ClockApplet *appl + int PlainClock::preferedWidthForHeight(int ) const + { + QString maxLengthTime = KGlobal::locale()->formatTime( QTime( 23, 59 ), _prefs->plainShowSeconds()); +- return fontMetrics().width( maxLengthTime+2 ); ++ return fontMetrics().width( maxLengthTime ) + 8; + } + + +@@ -244,7 +246,7 @@ void PlainClock::updateClock() + + if (_force || newStr != _timeStr) { + _timeStr = newStr; +- setText(_timeStr); ++ update(); + } + } + +@@ -266,6 +268,32 @@ bool PlainClock::showDayOfWeek() + return _prefs->plainShowDayOfWeek(); + } + ++void PlainClock::paintEvent(QPaintEvent *) ++{ ++ QPainter p; ++ QPixmap buf(size()); ++ buf.fill(this, 0, 0); ++ p.begin(&buf); ++ p.setFont(font()); ++ p.setPen(paletteForegroundColor()); ++ drawContents(&p); ++ drawFrame(&p); ++ p.end(); ++ p.begin(this); ++ p.drawPixmap(0, 0, buf); ++ p.end(); ++} ++ ++void PlainClock::drawContents(QPainter *p) ++{ ++ QRect tr(0, 0, width(), height()); ++ ++ if (!KickerSettings::transparent()) ++ p->drawText(tr, AlignCenter, _timeStr); ++ else ++ _applet->shadowEngine()->drawText(*p, tr, AlignCenter, _timeStr, size()); ++} ++ + //************************************************************ + + +@@ -834,12 +862,22 @@ void FuzzyClock::drawContents(QPainter * + + p->setFont(_prefs->fuzzyFont()); + p->setPen(_prefs->fuzzyForegroundColor()); +- if (_applet->getOrientation() == Vertical) { ++ ++ QRect tr; ++ ++ if (_applet->getOrientation() == Vertical) ++ { + p->rotate(90); +- p->drawText(4, -2, height() - 8, -(width()) + 2, AlignCenter, _timeStr); +- } else { +- p->drawText(4, 2, width() - 8, height() - 4, AlignCenter, _timeStr); ++ tr = QRect(4, -2, height() - 8, -(width()) + 2); + } ++ else ++ tr = QRect(4, 2, width() - 8, height() - 4); ++ ++ if (!KickerSettings::transparent()) ++ p->drawText(tr, AlignCenter, _timeStr); ++ else ++ _applet->shadowEngine()->drawText(*p, tr, AlignCenter, _timeStr, size()); ++ + alreadyDrawing = false; + } + +@@ -872,7 +910,8 @@ ClockApplet::ClockApplet(const QString& + _prefs(new Prefs(sharedConfig())), + zone(new Zone(config())), + menu(0), +- m_tooltip(this) ++ m_tooltip(this), ++ m_shadowEngine(0) + { + DCOPObject::setObjId("ClockApplet"); + _prefs->readConfig(); +@@ -910,6 +949,7 @@ ClockApplet::ClockApplet(const QString& + + ClockApplet::~ClockApplet() + { ++ delete m_shadowEngine; + //reverse for the moment + KGlobal::locale()->removeCatalogue("clockapplet"); + KGlobal::locale()->removeCatalogue("timezones"); // For time zone translations +@@ -929,6 +969,16 @@ ClockApplet::~ClockApplet() + config()->sync(); + } + ++ ++KTextShadowEngine *ClockApplet::shadowEngine() ++{ ++ if (!m_shadowEngine) ++ m_shadowEngine = new KTextShadowEngine(); ++ ++ return m_shadowEngine; ++} ++ ++ + int ClockApplet::widthForHeight(int h) const + { + if (orientation() == Qt::Vertical) +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -851,13 +851,6 @@ QStringList HALBackend::mountoptions(con + result << tmp; + } + +- if ( valids.contains("locale") ) +- { +- value = config.readBoolEntry( "locale", true ); +- tmp = QString( "locale=%1" ).arg( value ? "true" : "false" ); +- result << tmp; +- } +- + if (valids.contains("utf8")) + { + value = config.readBoolEntry("utf8", true); +@@ -878,6 +871,17 @@ QStringList HALBackend::mountoptions(con + result << "shortname=lower"; + } + ++ // pass our locale to the ntfs-3g driver so it can translate local characters ++ if (valids.contains("locale") && fstype == "ntfs-3g") ++ { ++ // have to obtain LC_CTYPE as returned by the `locale` command ++ // check in the same order as `locale` does ++ char *cType; ++ if ( (cType = getenv("LC_ALL")) || (cType = getenv("LC_CTYPE")) || (cType = getenv("LANG")) ) { ++ result << QString("locale=%1").arg(cType); ++ } ++ } ++ + if (valids.contains("sync")) + { + value = config.readBoolEntry("sync", ( valids.contains("flush") && !fstype.endsWith("fat") ) && removable); +@@ -931,7 +935,7 @@ bool HALBackend::setMountoptions(const Q + + QMap<QString,QString> valids = MediaManagerUtils::splitOptions(options); + +- const char *names[] = { "ro", "quiet", "atime", "uid", "utf8", "flush", "sync", "locale", 0 }; ++ const char *names[] = { "ro", "quiet", "atime", "uid", "utf8", "flush", "sync", 0 }; + for (int index = 0; names[index]; ++index) + if (valids.contains(names[index])) + config.writeEntry(names[index], valids[names[index]] == "true"); +@@ -951,10 +955,6 @@ bool HALBackend::setMountoptions(const Q + config.writeEntry("automount", valids["automount"]); + } + +- if (valids.contains("locale") ) { +- config.writeEntry("locale", valids["locale"]); +- } +- + return true; + } + +@@ -1153,11 +1153,6 @@ QString HALBackend::mount(const Medium * + soptions << QString("uid=%1").arg(getuid()); + } + +- if (valids["locale"] == "true") +- { +- soptions << QString("locale=%1").arg( KGlobal::locale()->language() ); +- } +- + if (valids["ro"] == "true") + soptions << "ro"; + +@@ -1182,6 +1177,11 @@ QString HALBackend::mount(const Medium * + soptions << QString("shortname=%1").arg(valids["shortname"]); + } + ++ if (valids.contains("locale")) ++ { ++ soptions << QString("locale=%1").arg(valids["locale"]); ++ } ++ + if (valids.contains("journaling")) + { + QString option = valids["journaling"]; +Index: knetattach/knetattach.ui +=================================================================== +--- knetattach/knetattach.ui.orig ++++ knetattach/knetattach.ui +@@ -236,7 +236,7 @@ + </sizepolicy> + </property> + <property name="maxValue"> +- <number>32768</number> ++ <number>65535</number> + </property> + <property name="minValue"> + <number>1</number> diff --git a/opensuse/core/tdebase/access.diff b/opensuse/core/tdebase/access.diff new file mode 100644 index 000000000..9f105550b --- /dev/null +++ b/opensuse/core/tdebase/access.diff @@ -0,0 +1,51 @@ +Index: kcontrol/access/kaccess.cpp +=================================================================== +--- kcontrol/access/kaccess.cpp.orig ++++ kcontrol/access/kaccess.cpp +@@ -216,7 +216,7 @@ void KAccessApp::readSettings() + xkb->ctrls->debounce_delay = config->readNumEntry("BounceKeysDelay", 500); + + // gestures for enabling the other features +- _gestures = config->readBoolEntry("Gestures", true); ++ _gestures = config->readBoolEntry("Gestures", ::access("/opt/kde3/bin/kmag", X_OK) == 0); + if (_gestures) + xkb->ctrls->enabled_ctrls |= XkbAccessXKeysMask; + else +@@ -241,7 +241,7 @@ void KAccessApp::readSettings() + else + xkb->ctrls->ax_options &= ~(XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask); + +- _gestureConfirmation = config->readBoolEntry("GestureConfirmation", true); ++ _gestureConfirmation = config->readBoolEntry("GestureConfirmation", ::access("/opt/kde3/bin/kmag", X_OK) == 0); + + _kNotifyModifiers = config->readBoolEntry("kNotifyModifiers", false); + _kNotifyAccessX = config->readBoolEntry("kNotifyAccessX", false); +Index: kcontrol/access/kcmaccess.cpp +=================================================================== +--- kcontrol/access/kcmaccess.cpp.orig ++++ kcontrol/access/kcmaccess.cpp +@@ -7,6 +7,7 @@ + + + #include <stdlib.h> ++#include <unistd.h> + #include <math.h> + + #include <dcopref.h> +@@ -686,12 +687,14 @@ void KAccessConfig::load( bool useDefaul + bounceKeysDelay->setValue(config->readNumEntry("BounceKeysDelay", 500)); + bounceKeysRejectBeep->setChecked(config->readBoolEntry("BounceKeysRejectBeep", true)); + +- gestures->setChecked(config->readBoolEntry("Gestures", true)); ++ gestures->setChecked(config->readBoolEntry("Gestures", ++ ::access("/opt/kde3/bin/kmag", X_OK) == 0)); + timeout->setChecked(config->readBoolEntry("AccessXTimeout", false)); + timeoutDelay->setValue(config->readNumEntry("AccessXTimeoutDelay", 30)); + + accessxBeep->setChecked(config->readBoolEntry("AccessXBeep", true)); +- gestureConfirmation->setChecked(config->readBoolEntry("GestureConfirmation", false)); ++ gestureConfirmation->setChecked(config->readBoolEntry("GestureConfirmation", ++ ::access("/opt/kde3/bin/kmag", X_OK) == 0)); + kNotifyAccessX->setChecked(config->readBoolEntry("kNotifyAccessX", false)); + + delete config; diff --git a/opensuse/core/tdebase/applet-lock-logout.diff b/opensuse/core/tdebase/applet-lock-logout.diff new file mode 100644 index 000000000..75363e768 --- /dev/null +++ b/opensuse/core/tdebase/applet-lock-logout.diff @@ -0,0 +1,122 @@ +Index: kicker/applets/lockout/lockout.cpp +=================================================================== +--- kicker/applets/lockout/lockout.cpp.orig ++++ kicker/applets/lockout/lockout.cpp +@@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <qtoolbutton.h> + #include <qstyle.h> + #include <qtooltip.h> ++#include <qobjectlist.h> + + #include <dcopclient.h> + +@@ -54,7 +55,7 @@ extern "C" + } + + Lockout::Lockout( const QString& configFile, QWidget *parent, const char *name) +- : KPanelApplet( configFile, KPanelApplet::Normal, 0, parent, name ), bTransparent( false ) ++ : KPanelApplet( configFile, KPanelApplet::Normal, 0, parent, name ), bTransparent( false ), bAlternateButtonOrder( false ) + { + KConfig *conf = config(); + conf->setGroup("lockout"); +@@ -71,8 +72,16 @@ Lockout::Lockout( const QString& configF + layout->setMargin( 0 ); + layout->setSpacing( 0 ); + +- lockButton = new SimpleButton( this, "lock"); +- logoutButton = new SimpleButton( this, "logout"); ++ bAlternateButtonOrder = !conf->readBoolEntry( "OriginalLayout",true ); ++ ++ if (bAlternateButtonOrder) { ++ lockButton = new SimpleButton( this, "lock"); ++ logoutButton = new SimpleButton( this, "logout"); ++ } ++ else { ++ logoutButton = new SimpleButton( this, "logout"); ++ lockButton = new SimpleButton( this, "lock"); ++ } + + QToolTip::add( lockButton, i18n("Lock the session") ); + QToolTip::add( logoutButton, i18n("Log out") ); +@@ -204,12 +213,15 @@ bool Lockout::eventFilter( QObject *o, Q + this, SLOT( lock() ) ); + popup->insertSeparator(); + ++ popup->insertItem( i18n( "&Alternate Button Order" ), 90 ); + i18n("&Transparent"); + //popup->insertItem( i18n( "&Transparent" ), 100 ); + popup->insertItem( SmallIcon( "configure" ), + i18n( "&Configure Screen Saver..." ), + this, SLOT( slotLockPrefs() ) ); + ++ popup->setItemChecked( 90, bAlternateButtonOrder ); ++ popup->connectItem(90, this, SLOT( slotButtonOrder() ) ); + //popup->setItemChecked( 100, bTransparent ); + //popup->connectItem(100, this, SLOT( slotTransparent() ) ); + //if (conf->entryIsImmutable( "Transparent" )) +@@ -226,6 +238,7 @@ bool Lockout::eventFilter( QObject *o, Q + popup->insertItem( SmallIcon( "exit" ), i18n("&Log Out..."), + this, SLOT( logout() ) ); + popup->insertSeparator(); ++ popup->insertItem( i18n( "&Alternate Button Order" ), 90 ); + //popup->insertItem( i18n( "&Transparent" ), 100 ); + popup->insertItem( SmallIcon( "configure" ), + i18n( "&Configure Session Manager..." ), +@@ -235,6 +248,9 @@ bool Lockout::eventFilter( QObject *o, Q + //popup->connectItem(100, this, SLOT( slotTransparent() ) ); + //if (conf->entryIsImmutable( "Transparent" )) + // popup->setItemEnabled( 100, false ); ++ popup->setItemChecked( 90, bAlternateButtonOrder ); ++ popup->connectItem(90, this, SLOT( slotButtonOrder() ) ); ++ + popup->exec( me->globalPos() ); + delete popup; + +@@ -263,6 +279,27 @@ void Lockout::slotTransparent() + conf->sync(); + } + ++void Lockout::slotButtonOrder() ++{ ++ QObject* child = children()->getFirst(); ++ ++ if (bAlternateButtonOrder) ++ child = lockButton; ++ else ++ child = logoutButton; ++ ++ removeChild(child); ++ insertChild(child); ++ update(); ++ ++ bAlternateButtonOrder = !bAlternateButtonOrder; ++ ++ KConfig* conf = config(); ++ conf->setGroup("lockout"); ++ conf->writeEntry( "OriginalLayout", !bAlternateButtonOrder ); ++ conf->sync(); ++} ++ + void Lockout::slotLogoutPrefs() + { + // Run the logout settings. +Index: kicker/applets/lockout/lockout.h +=================================================================== +--- kicker/applets/lockout/lockout.h.orig ++++ kicker/applets/lockout/lockout.h +@@ -36,6 +36,7 @@ private slots: + + void slotLockPrefs(); + void slotLogoutPrefs(); ++ void slotButtonOrder(); + void slotTransparent(); + void slotIconChanged(); + +@@ -47,6 +48,7 @@ private: + QBoxLayout *layout; + + bool bTransparent; ++ bool bAlternateButtonOrder; + }; + + #endif // LOCKOUT_H diff --git a/opensuse/core/tdebase/arts-start-on-demand.diff b/opensuse/core/tdebase/arts-start-on-demand.diff new file mode 100644 index 000000000..27fcc2292 --- /dev/null +++ b/opensuse/core/tdebase/arts-start-on-demand.diff @@ -0,0 +1,98 @@ +Index: kcontrol/arts/Makefile.am +=================================================================== +--- kcontrol/arts/Makefile.am.orig ++++ kcontrol/arts/Makefile.am +@@ -1,3 +1,9 @@ ++bin_PROGRAMS = arts-start ++ ++arts_start_SOURCES = arts-start.cpp ++arts_start_LDFLAGS = $(all_libraries) ++arts_start_LDADD = $(LIB_KDECORE) ++ + kde_module_LTLIBRARIES = kcm_arts.la + + kcm_arts_la_SOURCES = arts.cpp generaltab.ui hardwaretab.ui krichtextlabel.cpp +Index: kcontrol/arts/arts-start.cpp +=================================================================== +--- /dev/null ++++ kcontrol/arts/arts-start.cpp +@@ -0,0 +1,79 @@ ++/* ++ ++ Copyright (C) 2007 Lubos Lunak <l.lunak@suse.cz> ++ ++ 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. ++ ++ Permission is also granted to link this program with the Qt ++ library, treating Qt like a library that normally accompanies the ++ operating system kernel, whether or not that is in fact the case. ++ ++*/ ++ ++#include <kconfig.h> ++#include <kinstance.h> ++#include <stdlib.h> ++#include <unistd.h> ++#include <X11/Xlib.h> ++ ++static bool arts_running() ++ { ++ int status = system( "artsshell status >/dev/null 2>/dev/null" ); ++ return WIFEXITED( status ) && WEXITSTATUS( status ) == 0; ++ } ++ ++int main() ++ { ++ // Try to launch arts this way only a single time in the whole session. After first ++ // try set X property on the root window and following attemps bail out if it's set. ++ Display* dpy = XOpenDisplay( NULL ); ++ if( dpy == NULL ) // don't launch arts without X ++ return 4; ++ Atom atom = XInternAtom( dpy, "_KDE_ARTS_TRIED", False ); ++ int count; ++ Atom* atoms = XListProperties( dpy, DefaultRootWindow( dpy ), &count ); ++ bool tried = false; ++ if( atoms != NULL ) ++ { ++ for( int i = 0; ++ i < count; ++ ++i ) ++ if( atoms[ i ] == atom ) ++ { ++ tried = true; ++ break; ++ } ++ } ++ if( tried ) // this should probably wait, but artsshell will result in calling this too ++ return 2; ++ long dummy = 1; ++ XChangeProperty( dpy, DefaultRootWindow( dpy ), atom, atom, 32, PropModeReplace, (const unsigned char*)&dummy, 1 ); ++ XCloseDisplay( dpy ); ++ KInstance inst( "arts-start" ); ++ KConfig config("kcmartsrc", true, false); ++ config.setGroup("Arts"); ++ if( !config.readBoolEntry("StartServer",true)) ++ return 2; ++ system( "kcminit arts" ); ++ for( int i = 0; ++ i < 50; // give it 5 seconds ++ ++i ) ++ { ++ if( arts_running()) ++ return 0; ++ usleep( 100 * 1000 ); ++ } ++ return 3; ++ } diff --git a/opensuse/core/tdebase/artwork.diff b/opensuse/core/tdebase/artwork.diff new file mode 100644 index 000000000..ba13e5757 --- /dev/null +++ b/opensuse/core/tdebase/artwork.diff @@ -0,0 +1,35 @@ +Index: kioslave/fish/fish.protocol +=================================================================== +--- kioslave/fish/fish.protocol.orig ++++ kioslave/fish/fish.protocol +@@ -10,7 +10,7 @@ makedir=true + deleting=true + linking=true + moving=true +-Icon=remote ++Icon=folder_html + Description=A kioslave for the FISH protocol + Description[af]='n Kioslave vir die FISH protokol + Description[be]=Kioslave Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ‚Ð°ÐºÐ¾Ð»Ð° FISH +Index: kioslave/floppy/floppy.protocol +=================================================================== +--- kioslave/floppy/floppy.protocol.orig ++++ kioslave/floppy/floppy.protocol +@@ -9,6 +9,6 @@ writing=true + makedir=true + deleting=true + moving=true +-Icon=3floppy_mount ++Icon=3floppy_unmount + DocPath=kioslave/floppy.html + Class=:local +Index: kioslave/nfs/nfs.protocol +=================================================================== +--- kioslave/nfs/nfs.protocol.orig ++++ kioslave/nfs/nfs.protocol +@@ -11,4 +11,4 @@ deleting=true + linking=true + moving=true + DocPath=kioslave/nfs.html +-Icon=nfs_mount ++Icon=nfs_unmount diff --git a/opensuse/core/tdebase/autorun.patch b/opensuse/core/tdebase/autorun.patch new file mode 100644 index 000000000..962740cdc --- /dev/null +++ b/opensuse/core/tdebase/autorun.patch @@ -0,0 +1,27 @@ +Index: kioslave/media/medianotifier/medianotifier.cpp +=================================================================== +--- kioslave/media/medianotifier/medianotifier.cpp.orig ++++ kioslave/media/medianotifier/medianotifier.cpp +@@ -133,7 +133,7 @@ bool MediaNotifier::autostart( const KFi + // be checked for the following Autostart files in order of precedence: + // .autorun, autorun, autorun.sh + QStringList autorun_list; +- autorun_list << ".autorun" << "autorun" << "autorun.sh"; ++ autorun_list << ".autorun" << "autorun" << "autorun.sh" << "setup.sh" << "media.1/patches"; + + QStringList::iterator it = autorun_list.begin(); + QStringList::iterator end = autorun_list.end(); +@@ -191,7 +191,12 @@ bool MediaNotifier::execAutorun( const K + // with the current working directory ( CWD ) set to the root + // directory of the medium. + KProcess proc; +- proc << "sh" << autorunFile; ++ if (autorunFile == "setup.sh") ++ proc << "kdesu" << autorunFile; ++ else if (autorunFile == "media.1/patches") ++ proc << "kdesu" << "--nonewdcop" << "/sbin/yast2" << "online_update" << ".cd_default"; ++ else ++ proc << "sh" << autorunFile; + proc.setWorkingDirectory( path ); + proc.start(); + proc.detach(); diff --git a/opensuse/core/tdebase/background_default.diff b/opensuse/core/tdebase/background_default.diff new file mode 100644 index 000000000..71f9a96bb --- /dev/null +++ b/opensuse/core/tdebase/background_default.diff @@ -0,0 +1,13 @@ +Index: kcontrol/background/bgwallpaper.cpp +=================================================================== +--- kcontrol/background/bgwallpaper.cpp.orig ++++ kcontrol/background/bgwallpaper.cpp +@@ -149,7 +149,7 @@ void BGMultiWallpaperDialog::slotAdd() + mimeTypes += "image/svg+xml"; + #endif + +- KFileDialog fileDialog(KGlobal::dirs()->findDirs("wallpaper", "").first(), ++ KFileDialog fileDialog("/usr/share/wallpapers", + mimeTypes.join( " " ), this, + 0L, true); + diff --git a/opensuse/core/tdebase/baselibs.conf b/opensuse/core/tdebase/baselibs.conf new file mode 100644 index 000000000..29e28ab1d --- /dev/null +++ b/opensuse/core/tdebase/baselibs.conf @@ -0,0 +1,2 @@ +kdebase3 +kdebase3-runtime diff --git a/opensuse/core/tdebase/beagle-0.3.diff b/opensuse/core/tdebase/beagle-0.3.diff new file mode 100644 index 000000000..6e65be590 --- /dev/null +++ b/opensuse/core/tdebase/beagle-0.3.diff @@ -0,0 +1,21 @@ +--- kicker/configure.in.in 2008/01/28 11:03:28 1.1 ++++ kicker/configure.in.in 2008/01/28 11:03:45 +@@ -42,14 +42,14 @@ + AC_SUBST(GLIB_LIBADD) + AC_SUBST(GLIB_LDFLAGS) + +-dnl Check for libbeagle 0.2.0 ++dnl Check for libbeagle 0.3.0 + # LIBBEAGLE_CFLAGS: cflags for compiling libbeagle dependant sources + # LIBBEAGLE_LIBADD: libbeagle libraries (-l options) + # LIBBEAGLE_LDFLAGS: flags containing path to libbeagle libraries (-L options) + +-LIBBEAGLE_PACKAGES="libbeagle-0.0" +-LIBBEAGLE_VERSION="0.2.4" +-AC_MSG_CHECKING(for libbeagle-0.2.4 (at least $LIBBEAGLE_VERSION)) ++LIBBEAGLE_PACKAGES="libbeagle-1.0" ++LIBBEAGLE_VERSION="0.3.0" ++AC_MSG_CHECKING(for libbeagle-0.3.0 (at least $LIBBEAGLE_VERSION)) + + if $PKG_CONFIG --atleast-pkgconfig-version 0.15 ; then + if $PKG_CONFIG --atleast-version $LIBBEAGLE_VERSION $LIBBEAGLE_PACKAGES >/dev/null 2>&1 ; then diff --git a/opensuse/core/tdebase/bnc.desktop b/opensuse/core/tdebase/bnc.desktop new file mode 100644 index 000000000..c5db233cf --- /dev/null +++ b/opensuse/core/tdebase/bnc.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Charset= +Hidden=false +Keys=bnc +Name=Novell Bugzilla +Query=https://bugzilla.novell.com/show_bug.cgi?id=\\{@} +ServiceTypes=SearchProvider +Type=Service diff --git a/opensuse/core/tdebase/bnc584223.diff b/opensuse/core/tdebase/bnc584223.diff new file mode 100644 index 000000000..370abf150 --- /dev/null +++ b/opensuse/core/tdebase/bnc584223.diff @@ -0,0 +1,189 @@ +--- kdebase-3.5.10/kdm/backend/ctrl.c.sav 2010-03-23 13:22:28.000000000 +0100 ++++ kdebase-3.5.10/kdm/backend/ctrl.c 2010-03-23 14:21:48.619350322 +0100 +@@ -78,7 +78,25 @@ nukeSock( struct cmdsock *cs ) + } + + ++#ifdef HONORS_SOCKET_PERMS + static CtrlRec ctrl = { 0, 0, -1, 0, 0, { -1, 0, 0 } }; ++#else ++static CtrlRec ctrl = { 0, 0, 0, -1, 0, 0, { -1, 0, 0 } }; ++ ++static int mkTempDir( char *dir ) ++{ ++ int i, l = strlen( dir ) - 6; ++ ++ for (i = 0; i < 100; i++) { ++ randomStr( dir + l ); ++ if (!mkdir( dir, 0700 )) ++ return True; ++ if (errno != EEXIST) ++ break; ++ } ++ return False; ++} ++#endif + + void + openCtrl( struct display *d ) +@@ -140,22 +158,50 @@ openCtrl( struct display *d ) + if (strlen( cr->path ) >= sizeof(sa.sun_path)) + LogError( "path %\"s too long; no control sockets will be available\n", + cr->path ); +- else if (mkdir( sockdir, 0755 ) && errno != EEXIST) ++#ifdef HONORS_SOCKET_PERMS ++ else if (mkdir( sockdir, 0700 ) && errno != EEXIST) + LogError( "mkdir %\"s failed; no control sockets will be available\n", + sockdir ); ++ else if (unlink( cr->path ) && errno != ENOENT) ++ LogError( "unlink %\"s failed: %m; control socket will not be available\n", ++ cr->path ); + else { +- if (!d) +- chown( sockdir, -1, fifoGroup ); ++#else ++ else if (unlink( sockdir ) && errno != ENOENT) ++ LogError( "unlink %\"s failed: %m; control socket will not be available\n", ++ sockdir ); ++ else if (!strApp( &cr->realdir, sockdir, "-XXXXXX", (char *)0)) ++ ; ++ else if (!mkTempDir( cr->realdir )) { ++ LogError( "mkdir %\"s failed: %m; control socket will not be available\n", ++ cr->realdir ); ++ free( cr->realdir ); ++ cr->realdir = 0; ++ } else if (symlink( cr->realdir, sockdir )) { ++ LogError( "symlink %\"s => %\"s failed: %m; control socket will not be available\n", ++ sockdir, cr->realdir ); ++ rmdir( cr->realdir ); ++ free( cr->realdir ); ++ cr->realdir = 0; ++ } else { ++ chown( sockdir, 0, d ? 0 : fifoGroup ); + chmod( sockdir, 0750 ); ++#endif + if ((cr->fd = socket( PF_UNIX, SOCK_STREAM, 0 )) < 0) + LogError( "Cannot create control socket\n" ); + else { +- unlink( cr->path ); + sa.sun_family = AF_UNIX; + strcpy( sa.sun_path, cr->path ); + if (!bind( cr->fd, (struct sockaddr *)&sa, sizeof(sa) )) { + if (!listen( cr->fd, 5 )) { ++#ifdef HONORS_SOCKET_PERMS ++ chmod( cr->path, 0660 ); ++ if (!d) ++ chown( cr->path, -1, fifoGroup ); ++ chmod( sockdir, 0755 ); ++#else + chmod( cr->path, 0666 ); ++#endif + RegisterCloseOnFork( cr->fd ); + RegisterInput( cr->fd ); + free( sockdir ); +@@ -170,6 +216,14 @@ openCtrl( struct display *d ) + close( cr->fd ); + cr->fd = -1; + } ++#ifdef HONORS_SOCKET_PERMS ++ rmdir( sockdir ); ++#else ++ unlink( sockdir ); ++ rmdir( cr->realdir ); ++ free( cr->realdir ); ++ cr->realdir = 0; ++#endif + } + free( cr->path ); + cr->path = 0; +@@ -190,7 +244,14 @@ closeCtrl( struct display *d ) + cr->fd = -1; + unlink( cr->path ); + *strrchr( cr->path, '/' ) = 0; ++#ifdef HONORS_SOCKET_PERMS + rmdir( cr->path ); ++#else ++ unlink( cr->path ); ++ rmdir( cr->realdir ); ++ free( cr->realdir ); ++ cr->realdir = 0; ++#endif + free( cr->path ); + cr->path = 0; + while (cr->css) { +@@ -218,12 +279,12 @@ chownCtrl( CtrlRec *cr, int uid ) + { + if (cr->fpath) + chown( cr->fpath, uid, -1 ); +- if (cr->path) { +- char *ptr = strrchr( cr->path, '/' ); +- *ptr = 0; ++ if (cr->path) ++#ifdef HONORS_SOCKET_PERMS + chown( cr->path, uid, -1 ); +- *ptr = '/'; +- } ++#else ++ chown( cr->realdir, uid, -1 ); ++#endif + } + + void +--- kdebase-3.5.10/kdm/backend/dm.h.sav 2010-03-23 13:22:28.401354858 +0100 ++++ kdebase-3.5.10/kdm/backend/dm.h 2010-03-23 13:28:24.843351116 +0100 +@@ -218,6 +218,9 @@ typedef struct { + struct cmdsock *css; /* open connections */ + + char *path; /* filename of the socket */ ++#ifndef HONORS_SOCKET_PERMS ++ char *realdir; /* real dirname of the socket */ ++#endif + int fd; /* fd of the socket */ + int gid; /* owner group of the socket */ + +--- kdebase-3.5.10/config.h.in.sav 2008-08-20 18:00:23.000000000 +0200 ++++ kdebase-3.5.10/config.h.in 2010-03-23 13:36:38.913475918 +0100 +@@ -739,6 +739,9 @@ + /* Defined if your system has XRandR support */ + #undef XRANDR_SUPPORT + ++/* Define to 1 if OS honors permission bits on socket inodes */ ++#undef HONORS_SOCKET_PERMS ++ + /* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only +--- kdebase-3.5.10/configure.in.in.sav 2006-07-22 10:15:55.000000000 +0200 ++++ kdebase-3.5.10/configure.in.in 2010-03-23 13:51:24.504477535 +0100 +@@ -274,3 +274,31 @@ AC_SUBST(LIBART_RPATH) + AC_ARG_WITH([composite], + AC_HELP_STRING([--without-composite], [Disable Xcomposite support (default: check)]) ) + ++AC_TRY_RUN([ ++#include <sys/socket.h> ++#include <sys/un.h> ++#include <sys/stat.h> ++#include <sys/types.h> ++#include <string.h> ++#include <unistd.h> ++#include <errno.h> ++int main() ++{ ++ int fd, fd2; ++ struct sockaddr_un sa; ++ ++ if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) ++ return 2; ++ sa.sun_family = AF_UNIX; ++ strcpy(sa.sun_path, "testsock"); ++ unlink(sa.sun_path); ++ if (bind(fd, (struct sockaddr *)&sa, sizeof(sa))) ++ return 2; ++ chmod(sa.sun_path, 0); ++ setuid(getuid() + 1000); ++ if ((fd2 = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) ++ return 2; ++ connect(fd2, (struct sockaddr *)&sa, sizeof(sa)); ++ return errno != EACCES; ++} ++], AC_DEFINE_UNQUOTED(HONORS_SOCKET_PERMS, 1, [Define to 1 if OS honors permission bits on socket inodes])) diff --git a/opensuse/core/tdebase/clock-applet-style.diff b/opensuse/core/tdebase/clock-applet-style.diff new file mode 100644 index 000000000..42c768337 --- /dev/null +++ b/opensuse/core/tdebase/clock-applet-style.diff @@ -0,0 +1,22 @@ +Index: kicker/applets/clock/clockapplet.kcfg +=================================================================== +--- kicker/applets/clock/clockapplet.kcfg.orig ++++ kicker/applets/clock/clockapplet.kcfg +@@ -14,7 +14,7 @@ + <choice name="Analog"/> + <choice name="Fuzzy"/> + </choices> +- <default>Digital</default> ++ <default>Plain</default> + </entry> + </group> + <group name="Date"> +@@ -56,7 +56,7 @@ defFont.setPointSize(8); + <label>Font for the clock.</label> + <code> + defFont=KGlobalSettings::generalFont(); +-defFont.setPointSize(8); ++defFont.setPointSize(16); + defFont.setBold(true); + </code> + <default code="true">defFont</default> diff --git a/opensuse/core/tdebase/clock-suse-integrate.diff b/opensuse/core/tdebase/clock-suse-integrate.diff new file mode 100644 index 000000000..a4d24dff8 --- /dev/null +++ b/opensuse/core/tdebase/clock-suse-integrate.diff @@ -0,0 +1,288 @@ +Index: kcontrol/clock/tzone.cpp +=================================================================== +--- kcontrol/clock/tzone.cpp.orig ++++ kcontrol/clock/tzone.cpp +@@ -27,12 +27,16 @@ + + #include <qlabel.h> + #include <qfile.h> ++#include <qregexp.h> + + #include <kdebug.h> + #include <klocale.h> + #include <kmessagebox.h> + #include <kdialog.h> + #include <kio/netaccess.h> ++#include <kprocess.h> ++#include <ksavefile.h> ++#include <kstandarddirs.h> + + //#include "xpm/world.xpm" + #include "tzone.h" +@@ -55,6 +59,8 @@ Tzone::Tzone(QWidget * parent, const cha + connect( tzonelist, SIGNAL(selectionChanged()), SLOT(handleZoneChange()) ); + + m_local = new QLabel(this); ++ ++ setupSuseTimezone(); + + load(); + +@@ -158,28 +164,38 @@ void Tzone::save() + + QString val = selectedzone; + #else +- QFile fTimezoneFile("/etc/timezone"); ++ QString tz = "/usr/share/zoneinfo/" + selectedzone; + +- if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate) ) ++ kdDebug() << "Set time zone " << tz << endl; ++ ++ writeSuseTimezone( selectedzone ); ++ ++ if( !KStandardDirs::findExe( "zic" ).isEmpty()) + { +- QTextStream t(&fTimezoneFile); +- t << selectedzone; +- fTimezoneFile.close(); ++ KProcess proc; ++ proc << "zic" << "-l" << selectedzone; ++ proc.start( KProcess::Block ); + } ++ else ++ { ++ QFile fTimezoneFile("/etc/timezone"); + +- QString tz = "/usr/share/zoneinfo/" + selectedzone; +- +- kdDebug() << "Set time zone " << tz << endl; ++ if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate) ) ++ { ++ QTextStream t(&fTimezoneFile); ++ t << selectedzone; ++ fTimezoneFile.close(); ++ } + +- if (!QFile::remove("/etc/localtime")) +- { ++ if (!QFile::remove("/etc/localtime")) ++ { + //After the KDE 3.2 release, need to add an error message +- } +- else ++ } ++ else + if (!KIO::NetAccess::file_copy(KURL(tz),KURL("/etc/localtime"))) + KMessageBox::error( 0, i18n("Error setting new timezone."), + i18n("Timezone Error")); +- ++ } + QString val = ":" + tz; + #endif // !USE_SOLARIS + +@@ -198,3 +214,58 @@ void Tzone::save() + + currentZone(); + } ++ ++// read the configured timezone from /etc/sysconfig/clock ++// and simply set it as $TZ, KDE code then will take it as the timezone ++void Tzone::setupSuseTimezone() ++{ ++ QFile f( "/etc/sysconfig/clock" ); ++ if( !f.open( IO_ReadOnly )) ++ return; ++ QTextStream str( &f ); ++ while( !str.atEnd()) ++ { ++ QString line = str.readLine(); ++ if( line.startsWith( "TIMEZONE=" )) ++ { ++ QRegExp r( "\\s*TIMEZONE=\"(.*)\"\\s*" ); ++ if( r.exactMatch( line )) ++ { ++ QString tz = r.cap( 1 ); ++ setenv( "TZ", tz.ascii(), 1 ); ++ } ++ } ++ } ++} ++ ++void Tzone::writeSuseTimezone( QString zone ) ++{ ++ QFile f( "/etc/sysconfig/clock" ); ++ if( !f.open( IO_ReadOnly )) ++ return; ++ KSaveFile out( "/etc/sysconfig/clock", 0644 ); ++ QFile* fout = out.file(); ++ if( fout == NULL ) ++ return; ++ QTextStream str( &f ); ++ QTextStream strout( fout ); ++ while( !str.atEnd()) ++ { ++ QString line = str.readLine(); ++ if( line.startsWith( "TIMEZONE=" )) ++ { ++ QRegExp r( "\\s*TIMEZONE=\"(.*)\"\\s*" ); ++ if( r.exactMatch( line )) ++ { ++ QString tz = r.cap( 1 ); ++ if( tz == zone ) // not changed, abort ++ { ++ out.abort(); ++ return; ++ } ++ line = "TIMEZONE=\"" + zone + "\""; ++ } ++ } ++ strout << line << '\n'; ++ } ++} +Index: kcontrol/clock/tzone.h +=================================================================== +--- kcontrol/clock/tzone.h.orig ++++ kcontrol/clock/tzone.h +@@ -47,6 +47,8 @@ protected slots: + + private: + void currentZone(); ++ void setupSuseTimezone(); ++ void writeSuseTimezone( QString timezone ); + KTimezones m_zoneDb; + QLabel *m_local; + KTimezoneWidget *tzonelist; +Index: kcontrol/clock/dtime.h +=================================================================== +--- kcontrol/clock/dtime.h.orig ++++ kcontrol/clock/dtime.h +@@ -65,6 +65,9 @@ signals: + void timeout(); + void set_time(); + void changeDate(QDate); ++#if 1 ++ void configureTimeServer(); ++#endif + + private: + void findNTPutility(); +@@ -72,7 +75,11 @@ private: + + QWidget* privateLayoutWidget; + QCheckBox *setDateTimeAuto; ++#if 1 ++ QPushButton *timeServerConfigure; ++#else + QComboBox *timeServerList; ++#endif + + KDatePicker *cal; + QComboBox *month; +Index: kcontrol/clock/dtime.cpp +=================================================================== +--- kcontrol/clock/dtime.cpp.orig ++++ kcontrol/clock/dtime.cpp +@@ -38,6 +38,7 @@ + #include <kmessagebox.h> + #include <kdialog.h> + #include <kconfig.h> ++#include <kstandarddirs.h> + + #include "dtime.h" + #include "dtime.moc" +@@ -74,6 +75,18 @@ Dtime::Dtime(QWidget * parent, const cha + connect(setDateTimeAuto, SIGNAL(toggled(bool)), SLOT(configChanged())); + layout1->addWidget( setDateTimeAuto ); + ++#if 1 ++ // simply add a pushbutton that'll invoke the yast module ++ ntpUtility = KStandardDirs::findExe( "rcntp"); ++ timeServerConfigure = new QPushButton( i18n( "Configure" ), privateLayoutWidget, "timeServerConfigure" ); ++ connect(timeServerConfigure, SIGNAL(clicked()), SLOT(configChanged())); ++ connect(timeServerConfigure, SIGNAL(clicked()), SLOT(configureTimeServer())); ++ connect(setDateTimeAuto, SIGNAL(toggled(bool)), timeServerConfigure, SLOT(setEnabled(bool))); ++ timeServerConfigure->setEnabled(false); ++ layout1->addWidget( timeServerConfigure ); ++ if( ntpUtility.isEmpty()) ++ privateLayoutWidget->hide(); ++#else + timeServerList = new QComboBox( false, privateLayoutWidget, "timeServerList" ); + connect(timeServerList, SIGNAL(activated(int)), SLOT(configChanged())); + connect(timeServerList, SIGNAL(textChanged(const QString &)), SLOT(configChanged())); +@@ -82,6 +95,7 @@ Dtime::Dtime(QWidget * parent, const cha + timeServerList->setEditable(true); + layout1->addWidget( timeServerList ); + findNTPutility(); ++#endif + + // Date box + QGroupBox* dateBox = new QGroupBox( this, "dateBox" ); +@@ -179,7 +193,11 @@ Dtime::Dtime(QWidget * parent, const cha + hour->setEnabled(false); + minute->setEnabled(false); + second->setEnabled(false); ++#if 1 ++ timeServerConfigure->setEnabled(false); ++#else + timeServerList->setEnabled(false); ++#endif + setDateTimeAuto->setEnabled(false); + } + kclock->setEnabled(false); +@@ -241,6 +259,15 @@ void Dtime::configChanged(){ + void Dtime::load() + { + KConfig config("kcmclockrc", true, false); ++#if 1 ++ if( !ntpUtility.isEmpty()) ++ { ++ KProcess proc; ++ proc << ntpUtility << "status"; ++ proc.start( KProcess::Block ); ++ setDateTimeAuto->setChecked( proc.exitStatus() == 0 ); ++ } ++#else + config.setGroup("NTP"); + timeServerList->insertStringList(QStringList::split(',', config.readEntry("servers", + i18n("Public Time Server (pool.ntp.org),\ +@@ -249,6 +276,7 @@ europe.pool.ntp.org,\ + north-america.pool.ntp.org,\ + oceania.pool.ntp.org")))); + setDateTimeAuto->setChecked(config.readBoolEntry("enabled", false)); ++#endif + + // Reset to the current date and time + time = QTime::currentTime(); +@@ -264,6 +292,7 @@ oceania.pool.ntp.org")))); + void Dtime::save() + { + KConfig config("kcmclockrc", false, false); ++#if 0 + config.setGroup("NTP"); + + // Save the order, but don't duplicate! +@@ -301,7 +330,9 @@ void Dtime::save() + kdDebug() << "Set date from time server " << timeServer.latin1() << " success!" << endl; + } + } +- else { ++ else ++#endif ++ { + // User time setting + KProcess c_proc; + +@@ -356,6 +387,13 @@ void Dtime::timeout() + kclock->setTime( time ); + } + ++void Dtime::configureTimeServer() ++{ ++ KProcess proc; ++ proc << "/sbin/yast2" << "ntp-client"; ++ proc.start( KProcess::DontCare ); ++} ++ + QString Dtime::quickHelp() const + { + return i18n("<h1>Date & Time</h1> This control module can be used to set the system date and" diff --git a/opensuse/core/tdebase/console8x16.pcf.gz b/opensuse/core/tdebase/console8x16.pcf.gz Binary files differnew file mode 100644 index 000000000..db4be9f47 --- /dev/null +++ b/opensuse/core/tdebase/console8x16.pcf.gz diff --git a/opensuse/core/tdebase/default-kdeprintfax.diff b/opensuse/core/tdebase/default-kdeprintfax.diff new file mode 100644 index 000000000..ed686b4a7 --- /dev/null +++ b/opensuse/core/tdebase/default-kdeprintfax.diff @@ -0,0 +1,13 @@ +Index: kdeprint/kdeprintfax/confsystem.cpp +=================================================================== +--- kdeprint/kdeprintfax/confsystem.cpp.orig ++++ kdeprint/kdeprintfax/confsystem.cpp +@@ -103,7 +103,7 @@ void ConfSystem::load() + m_commands << conf->readPathEntry("HylaFax", defaultCommand(hylafax_default_cmd)); + m_commands << conf->readPathEntry("Mgetty", defaultCommand(mgetty_default_cmd)); + m_commands << conf->readPathEntry( "Other", QString::null ); +- QString v = conf->readEntry("System", "efax"); ++ QString v = conf->readEntry("System", "hylafax"); + if (v == "mgetty") m_current = MGETTY_ID; + else if (v == "hylafax") m_current = HYLAFAX_ID; + else if ( v == "other" ) m_current = OTHER_ID; diff --git a/opensuse/core/tdebase/default_fonts.diff b/opensuse/core/tdebase/default_fonts.diff new file mode 100644 index 000000000..4300b5aed --- /dev/null +++ b/opensuse/core/tdebase/default_fonts.diff @@ -0,0 +1,25 @@ +Index: kcontrol/fonts/fonts.cpp +=================================================================== +--- kcontrol/fonts/fonts.cpp.orig ++++ kcontrol/fonts/fonts.cpp +@@ -1,3 +1,4 @@ ++ + // KDE Display fonts setup tab + // + // Copyright (c) Mark Donohoe 1997 +@@ -524,11 +525,11 @@ KFonts::KFonts(QWidget *parent, const ch + + // Keep in sync with kdelibs/kdecore/kglobalsettings.cpp + +- QFont f0("Sans Serif", 10); +- QFont f1("Monospace", 10); ++ QFont f0("Sans Serif", 12); ++ QFont f1("courier", 12); + QFont f2("Sans Serif", 10); +- QFont f3("Sans Serif", 9, QFont::Bold); +- QFont f4("Sans Serif", 10); ++ QFont f3("Sans Serif", 12, QFont::Bold); ++ QFont f4("Sans Serif", 11); + + f0.setPointSize(10); + f1.setPointSize(10); diff --git a/opensuse/core/tdebase/devmon-automounter.sh b/opensuse/core/tdebase/devmon-automounter.sh new file mode 100644 index 000000000..ff2de18f1 --- /dev/null +++ b/opensuse/core/tdebase/devmon-automounter.sh @@ -0,0 +1,1086 @@ +#!/bin/bash +# Script Name: devmon http://igurublog.wordpress.com/downloads/script-devmon/ +# Requires: udisks bash>=4 +# Recommended: consolekit zenity +# License: GNU GENERAL PUBLIC LICENSE Version 3 http://www.gnu.org/licenses/gpl-3.0.txt +# Thanks to Bernard Baeyens (berbae) for code from udisksvm script +# https://bbs.archlinux.org/viewtopic.php?id=112397 + +#========================================================================= + +defaultmountoptions="noexec,nosuid,noatime" + +#========================================================================= + +help() +{ + cat << EOF +devmon version 1.0.5 +Automounts and unmounts optical and removable drives using udisks +Requires: udisks bash>=4 Recommended: consolekit zenity +Usage: devmon [AUTOMOUNT-OPTIONS] # Run as daemon to automount + devmon [MOUNT-OPTIONS] # Or run as client to manually un/mount +AUTOMOUNT-OPTIONS: (these can be used only in daemon mode) +--exec-on-device DEVICE "COMMAND" Execute COMMAND after mounting DEVICE +--exec-on-label "LABEL" "COMMAND" Execute COMMAND after mounting LABEL +--exec-on-video "COMMAND" Execute COMMAND after video DVD mount +--exec-on-audio "COMMAND" Execute COMMAND after audio CD insertion +--exec-on-disc "COMMAND" Execute COMMAND after data CD/DVD mount +--exec-on-drive "COMMAND" Execute COMMAND after drive mount +--exec-on-unmount "COMMAND" Execute COMMAND after unmount +--exec-on-remove "COMMAND" Execute COMMAND after drive removal + Where the following in COMMAND will be replaced with: + %d mount point directory (eg /media/cd) + %f device name (eg /dev/sdd1) + %l label of mounted volume + Multiple --exec-on-XXX options may be used to execute multiple commands. + Other exec-on-XXX commands are ignored if exec-on-device or -label executed. +--mount-options "OPTIONS" Default: $defaultmountoptions +--info-on-mount Show mounted drive info in a zenity dialog +--no-mount Don't mount anything, just exec (disables + --exec-on-video) +--no-unmount Don't unmount all removable drives on exit + +MOUNT-OPTIONS: (these can be used only in client mode) +--unmount-removable | -r Sync and unmount all removable drives and show + pop-up dialog (zenity installation required) +--unmount-recent | -c Unmount most recently mounted removable drive +--unmount-optical | -o Unmount all optical drives (error pop-up only) +--unmount-all | -u Same as --unmount-removable --unmount-optical +--unmount DIR|DEVICE Unmount DEVICE or mount point DIR +--eject DIR|DEVICE Unmount and eject DEVICE or mount point DIR +--mount-all | -a Mount all removable and optical drives +--mount DEVICE Mount DEVICE +--mount-options|--mount-fstype|--unmount-options|--eject-options "OPTIONS" + These options will be passed to udisks + +UNIVERSAL OPTIONS: (these can be used in both daemon and client modes) +--ignore-device DEVICE Ignore DEVICE (eg /dev/sdd1) +--ignore-label "LABEL" Ignore volume with LABEL +--sync | -s Add sync mount option for ext2-4 ntfs ufs, or + flush for fat & vfat (slower writing but safer) +--internal Also attempt to un/mount internal system drives + (this is mostly a fix for esata issues) +--no-gui | -g Do not show zenity pop-up dialogs +Instructions and updates: + http://igurublog.wordpress.com/downloads/script-devmon/ +EOF + exit +} + +test2() +{ + if [ "${2:0:1}" = "-" ] || [ "$2" = "" ]; then + echo "devmon: Option $1 requires an argument" 1>&2 + exit 1 + fi +} + +test3() +{ + if [ "${2:0:1}" = "-" ] || [ "$2" = "" ] || \ + [ "${3:0:1}" = "-" ] || [ "$3" = "" ]; then + echo "devmon: Option $1 requires two arguments" 1>&2 + exit 1 + fi +} + +unknown() +{ + echo "devmon: Unknown option $1" 1>&2 + echo " For help use: devmon --help" 1>&2 + exit 1 +} + +# parse command line +execoix=0 +execomx=0 +execovx=0 +execoax=0 +execodx=0 +execolx=0 +execoux=0 +execorx=0 +umntx=0 +mntx=0 +ejx=0 +igdevx=0 +iglabx=0 +while [ "$1" != "" ]; do + if [ "${1:0:1}" = "-" ]; then + case "$1" in + --help ) + help + exit + ;; + # don't use eval on these to preserve command strings + --exec-on-drive ) + test2 "$1" "$2" + execoi[$execoix]="$2" + (( execoix++ )) + shift + ;; + --exec-on-disc ) + test2 "$1" "$2" + execom[$execomx]="$2" + (( execomx++ )) + shift + ;; + --exec-on-video ) + test2 "$1" "$2" + execov[$execovx]="$2" + (( execovx++ )) + shift + ;; + --exec-on-audio ) + test2 "$1" "$2" + execoa[$execoax]="$2" + (( execoax++ )) + shift + ;; + --exec-on-device ) + test3 "$1" "$2" "$3" + execod1[$execodx]="$2" + execod2[$execodx]="$3" + (( execodx++ )) + shift 2 + ;; + --exec-on-label ) + test3 "$1" "$2" "$3" + execol1[$execolx]="$2" + execol2[$execolx]="$3" + (( execolx++ )) + shift 2 + ;; + --exec-on-unmount ) + test2 "$1" "$2" + execou[$execoux]="$2" + (( execoux++ )) + shift + ;; + --exec-on-remove ) + test2 "$1" "$2" + execor[$execorx]="$2" + (( execorx++ )) + shift + ;; + --info-on-mount ) + infomount=1 + ;; + --no-mount ) + nomount=1 + ;; + --sync ) + syncopt=1 + ;; + --unmount-on-exit ) + # leave for usage compat with versions prior to 1.0.1 + ;; + --no-unmount ) + nounmount=1 + ;; + --unmount-all ) + unmountrem=1 + unmountoptical=1 + ;; + --unmount-removable ) + unmountrem=1 + ;; + --unmount-optical ) + unmountoptical=1 + ;; + --unmount-recent ) + unmountrecent=1 + ;; + --unmount ) + test2 "$1" "$2" + umnt[$umntx]="$2" + (( umntx++ )) + shift + ;; + --mount-all ) + mountall=1 + ;; + --mount ) + test2 "$1" "$2" + mnt[$mntx]="$2" + (( mntx++ )) + shift + ;; + --eject ) + test2 "$1" "$2" + ej[$ejx]="$2" + (( ejx++ )) + shift + ;; + --mount-options ) + test2 "$1" "$2" + mountoptions="$2" + shift + ;; + --mount-fstype ) + test2 "$1" "$2" + mountfstype="$2" + shift + ;; + --unmount-options ) + test2 "$1" "$2" + unmountoptions="$2" + shift + ;; + --eject-options ) + test2 "$1" "$2" + ejectoptions="$2" + shift + ;; + --internal ) + internal=1 + ;; + --nogui | --no-gui ) + nogui=1 + ;; + --ignore-device ) + test2 "$1" "$2" + igdev[$igdevx]="$2" + (( igdevx++ )) + shift + ;; + --ignore-label ) + test2 "$1" "$2" + iglab[$iglabx]="$2" + (( iglabx++ )) + shift + ;; + --* ) + unknown "$1";; + -* ) + o="${1:1}" + while [ "$o" != "" ]; do + case "${o:0:1}" in + r ) + unmountrem=1;; + o ) + unmountoptical=1;; + u ) + unmountrem=1 + unmountoptical=1 + ;; + a ) + mountall=1;; + s ) + syncopt=1;; + c ) + unmountrecent=1;; + g ) + nogui=1;; + h ) + help + exit + ;; + * ) + unknown "-${o:0:1}";; + esac + o="${o:1}" + done + ;; + esac + else + unknown "$1" + fi + shift +done +(( mountmode = umntx + mntx + ejx + unmountrem + unmountoptical + mountall + unmountrecent )) + +# Warnings +if [ "$(whoami)" = "root" ]; then + echo "WARNING: running devmon as root is usually not required or recommended" 1>&2 +fi + +if (( execoix + execomx + execovx + execoax + execodx + execolx + execoux + execorx \ + + nounmount + infomount != 0 )) && (( mountmode != 0 )); then + echo "WARNING: devmon automount options ignored in mount mode" 1>&2 +fi + +driveinfo() #$1=dev #Optional $2=quiet +{ + unset systeminternal usage ismounted presentationnopolicy hasmedia \ + opticaldisc numaudiotracks type partition media blank label + uinfos=`udisks --show-info $1 2> /dev/null` + label=`echo "$uinfos" | grep -m 1 "^ label:" | sed 's/ *label: *\(.*\)/\1/'` + listinfos=`echo "$uinfos" | grep \ + -e "^ system internal:" \ + -e "^ usage:" \ + -e "^ type:" \ + -e "^ is mounted:" \ + -e "^ presentation nopolicy:" \ + -e "^ has media" \ + -e "^ optical disc:" \ + -e " blank:" \ + -e " num audio tracks:" \ + -e "^ partition:" \ + -e " media:"` + # The change for type= is to take only its first value in listinfos + listinfos=$(echo "$listinfos" | sed 's/ //g + s/:/=/ + s/opticaldisc=/&1/ + s/type=\(.*\)/type=${type:-\1}/ + s/[()]//g + s/partition=/&1/') + eval "$listinfos" + if (( internal == 1 )); then + systeminternal="ignored" + fi + # Take only the first character + hasmedia=${hasmedia:0:1} + # If "partition:" not find in listinfos, should mean it is not a partition + partition=${partition:-0} + nopolicy="$presentationnopolicy" + if (( mountmode == 0 )) && [ "$systeminternal" != "1" ] && [ "$2" != "quiet" ]; then + if [ "$usage" = "filesystem" ] || [ "$opticaldisc" = "1" ]; then + echo "device: [$1]" + echo " systeminternal: [$systeminternal]" + echo " usage: [$usage]" + echo " type: [$type]" + echo " label: [$label]" + echo " ismounted: [$ismounted]" + echo " nopolicy: [$nopolicy]" + echo " hasmedia: [$hasmedia]" + echo " opticaldisc: [$opticaldisc]" + echo " numaudiotracks: [$numaudiotracks]" + echo " blank: [$blank]" + echo " media: [$media]" + echo " partition: [$partition]" + fi + fi +} + +ignoredevice() +{ + idx=0 + while (( idx < igdevx )); do + if [ "$1" = "${igdev[$idx]}" ]; then + echo "devmon: ignored device $1" + return 0 + fi + (( idx++ )) + done + return 1 +} + +ignorelabel() +{ + ilx=0 + while (( ilx < iglabx )); do + if [ "$1" = "${iglab[$ilx]}" ]; then + echo "devmon: ignored label $1" + return 0 + fi + (( ilx++ )) + done + return 1 +} + +execcommands() # $exectype "${exec[@]}" +{ + exectype="$1" + shift + while [ "$1" != "" ]; do + usercmd="$1" + usercmd="${usercmd//%f/$dv}" + usercmd="${usercmd//%l/'$lb'}" + usercmd="${usercmd//%d/'$point'}" + if [ "$usercmd" != "" ]; then + echo "devmon: [$exectype] eval $usercmd &" + eval $usercmd & + fi + shift + done +} + +mountdev() # $1=device [$2=label] [$3=devtype or fstype] +{ + # set label comment + if [ "$2" = "" ]; then + lblcmt="" + else + lblcmt="($2)" + fi + # set mount-fstype option + if [ "$mountfstype" != "" ]; then + fst="--mount-fstype" + else + fst="" + fi + # set default mount options + if [ "$mountoptions" != "" ]; then + mopts="$mountoptions" + else + mopts="$defaultmountoptions" + fi + # set sync mount options + if (( syncopt == 1 )); then + case "$3" in + ext2 | ext3 | ext4 | ufs | ntfs ) + mopts="$mopts,sync";; + fat | vfat ) + mopts="$mopts,flush";; + esac + fi + # mount + mntmsg="devmon: mount $1 --mount-options $mopts $fst $mountfstype $lblcmt" + if [ "$3" != "nofs" ]; then + echo "$mntmsg" + fi + umsg=`udisks --mount $1 --mount-options "$mopts" $fst $mountfstype 2>&1` + mounterr="$?" + # get mount point + point=`echo "$umsg" | grep "^Mounted " | sed 's/^Mounted .* at \(.*\)/\1/'` + if [ "$mounterr" != "0" ] || [ "$point" = "" ]; then + # if $3=nofs then there was no apparent filesystem but we tried to mount it + # anyway in case it didn't report the filesystem accurately, so ignore the + # error + if [ "$3" != "nofs" ]; then + echo "$umsg" 1>&2 + echo "devmon: error mounting $1 ($mounterr)" 1>&2 + if (( mountmode == 0 )) && (( polkiterrgiven != 1 )) && \ + [ "$(echo "$umsg" | grep "Not Authorized")" != "" ]; then + if (( nogui != 1 )); then + ( sleep 3 && WINDOWID="" zenity --error --no-wrap --title="devmon error" \ + --text="udisks functions are not authorized through policykit,\nso devmon cannot automount drives.\nPlease see devmon's consolekit installation instructions:\n\nhttp://igurublog.wordpress.com/downloads/script-devmon/#install\n\n(To silence this pop-up add --no-gui to devmon's command line.)" &> /dev/null ) & + fi + echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" 1>&2 + echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" 1>&2 + echo "udisks functions are not authorized through policykit," 1>&2 + echo "so devmon cannot automount drives." 1>&2 + echo "Please see devmon's consolekit installation instructions:" 1>&2 + echo "http://igurublog.wordpress.com/downloads/script-devmon/#install" 1>&2 + echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" 1>&2 + echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" 1>&2 + polkiterrgiven=1 + fi + fi + uerr=3 + return 3 + elif [ "$3" = "nofs" ]; then + # no filesystem reported but successful mount + echo "$mntmsg" + fi + echo "$umsg" +} + +unmountdev() # $1=device +{ + if [ "$unmountoptions" != "" ]; then + echo "devmon: unmount $1 --unmount-options $unmountoptions" + uerrmsg=`udisks --unmount $1 --unmount-options "$unmountoptions" 2>&1` + else + echo "devmon: unmount $1" + uerrmsg=`udisks --unmount $1 2>&1` + fi + if [ "$uerrmsg" != "" ]; then + # bug: udisks returns $?==0 when unmount fails + echo "$uerrmsg" + uerr=3 + return 3 + fi +} + +ejectdev() +{ + if [ "$ejectoptions" != "" ]; then + echo "devmon: eject $1 --eject-options $ejectoptions" + udisks --eject $1 --eject-options "$ejectoptions" + else + echo "devmon: eject $1" + udisks --eject $1 + fi + if [ "$?" != "0" ]; then + uerr=3 + return 3 + fi +} + +mountdrive() # $1=device $2=label [$3=devtype or fstype] +{ + dv="$1" + lb="$2" + tp="$3" + unset point + + if ( ignoredevice "$dv" ) || ( ignorelabel "$lb" ); then + return + fi + + # mount + if [ "$tp" != "audiocd" ] && (( nomount != 1 )); then + mountdev $dv "$lb" "$tp" + if [ "$?" != "0" ]; then + return + fi + fi + + # exec on device + unset execdone + x=0 + while (( x < execodx )); do + if [ "${execod1[$x]}" = "$dv" ]; then + usercmd="${execod2[$x]}" + usercmd="${usercmd//%f/$dv}" + usercmd="${usercmd//%l/'$lb'}" + usercmd="${usercmd//%d/'$point'}" + if [ "$usercmd" != "" ]; then + echo "devmon: [exec on device] eval $usercmd" + eval $usercmd & + execdone=1 + fi + fi + (( x++ )) + done + if (( execdone == 1 )); then return; fi + + # exec on label + x=0 + while (( x < execolx )); do + if [ "${execol1[$x]}" = "$lb" ]; then + usercmd="${execol2[$x]}" + usercmd="${usercmd//%f/$dv}" + usercmd="${usercmd//%l/'$lb'}" + usercmd="${usercmd//%d/'$point'}" + if [ "$usercmd" != "" ]; then + echo "devmon: [exec on label] eval $usercmd" + eval $usercmd & + execdone=1 + fi + fi + (( x++ )) + done + if (( execdone == 1 )); then return; fi + + # exec on video + if [ "$tp" = "dvd" ] && [ "$point" != "" ] && [ -d "$point/VIDEO_TS" ]; then + echo "devmon: videodvd $dv ($lb) on $point" + if (( execovx != 0 )); then + execcommands "exec on video" "${execov[@]}" + fi + return + fi + + # exec on audio + if [ "$tp" = "audiocd" ]; then + echo "devmon: audiocd $dv ($lb)" + if (( execoax != 0 )); then + execcommands "exec on audio" "${execoa[@]}" + fi + return + fi + + # exec on disc + if [ "$tp" = "optical" ] || [ "$tp" = "dvd" ]; then + if [ "$point" != "" ] || (( nomount == 1 )); then + if (( execomx != 0 )); then + execcommands "exec on disc" "${execom[@]}" + fi + fi + return + fi + + # exec on drive + if [ "$point" != "" ] || (( nomount == 1 )); then + if (( execoix != 0 )); then + execcommands "exec on drive" "${execoi[@]}" + fi + fi + + # info on mount + if [ "$point" != "" ] && (( infomount == 1 )) && (( nomount != 1 )); then + sleep .5 + echo "devmon: [info on mount] $dv" + if (( nogui != 1 )); then + WINDOWID="" zenity --info --text="The following device has been mounted:\n\n$(df -hT "$dv" \ + | grep "$dv" | awk '{print "Device:\\t"$1"\x0AType:\\t"$2"\nSize:\\t\\t"$3"\nUsed:\\t"$4"\n""Avail:\\t"$5"\nUse%:\\t"$6"\nMount:\\t"$7,$8,$9,$10}')\nLabel:\\t$lb" --title="devmon mount" & + fi + df -hT "$dv" + fi +} + +mountalldrives() +{ + # Mount all optical drives, no exec + x=0 + while [ -e /dev/sr$x ]; do + driveinfo /dev/sr$x + if [ "$numaudiotracks" = "" ]; then + numaudiotracks=0 + fi + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" = "1" ] && \ + [ "$ismounted" != "1" ] && [ "$hasmedia" != "0" ] && \ + [ "$blank" != "1" ] && (( numaudiotracks == 0 )) && \ + [ "$nopolicy" != "1" ]; then + if ( ignoredevice "/dev/sr$x" ) || ( ignorelabel "$label" ); then + (( x++ )) + continue + fi + mountdev /dev/sr$x "$label" + eval notejectedsr$x=1 + fi + (( x++ )) + done + # Mount removable drives, no exec + IFSOLD="$IFS" + IFS=$'\n' + partlist=`grep " sd[a-z0-9]*$" /proc/partitions | sed 's/.* \(sd[a-z0-9]*\)/\1/'` + for p in $partlist; do + if ( ignoredevice "/dev/$p" ); then + continue + fi + driveinfo /dev/$p + if ( ignorelabel "$label" ); then + continue + else + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" != "1" ] && \ + [ "$ismounted" = "0" ] && [ "$nopolicy" != "1" ]; then + if [ "$usage" = "filesystem" ]; then + echo "mountdev /dev/$p $label $type" + mountdev /dev/$p "$label" "$type" + else + mountdev /dev/$p "$label" nofs + fi + fi + fi + done + IFS="$IFSOLD" +} + +trapexit() +{ + kill $COPROC_PID 2> /dev/null + + # prevent trap code from executing multiple times on different signals + if (( trapdone != 1 )); then + trapdone=1 + # Unmount All + if (( nounmount != 1 )); then + IFSOLD="$IFS" + IFS=$'\n' + uerr=0 + partlist=`grep " sd[a-z0-9]*$" /proc/partitions | \ + sed 's/.* \(sd[a-z0-9]*\)/\1/'` + for p in $partlist; do + if ( ignoredevice "/dev/$p" ); then + continue + fi + driveinfo /dev/$p + if ( ignorelabel "$label" ); then + continue + else + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" != "1" ] && \ + [ "$usage" = "filesystem" ] && [ "$ismounted" = "1" ]; then + echo "devmon: [on exit] unmount /dev/$p &" + udisks --unmount /dev/$p & + if [ "$?" != "0" ]; then + uerr=3 + fi + fi + fi + done + IFS="$IFSOLD" + fi + echo 'devmon: stopped' + exit $uerr + fi +} + +# Client Mode +if (( mountmode != 0 )); then + uerr=0 + if (( unmountrem == 1 )) || (( unmountrecent == 1 )); then + y=0 + unset udrive zpid + IFSOLD="$IFS" + IFS=$'\n' + if (( unmountrem == 1 )); then + # Unmount All Removable Drives + partlist=`grep " sd[a-z0-9]*$" /proc/partitions | sed 's/.* \(sd[a-z0-9]*\)/\1/'` + msgtitle="devmon unmount" + else + # Unmount Recent + partlist=`mount | grep "^/dev/.* on " | sed 's/^\/dev\/\(.*\) on .*/\1/' \ + | grep -v -e "null" -e "shm" -e "mapper" -e "snd" \ + -e "video" -e "random" | tac` + msgtitle="devmon unmount recent" + fi + for p in $partlist; do + if ( ignoredevice "/dev/$p" ); then + continue + fi + driveinfo /dev/$p + if ( ignorelabel "$label" ); then + continue + else + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" != "1" ] \ + && [ "$ismounted" = "1" ]; then + udrive[$y]="/dev/$p" + (( y++ )) + if (( unmountrem != 1 )); then break; fi + fi + fi + done + IFS="$IFSOLD" + if (( y == 0 )); then + msg="No removable drives are mounted" + echo "$msg" + else + msg="Unmounting ${udrive[@]}...\n\n(This dialog will close when the devices are unmounted)" + echo "Preparing to unmount ${udrive[@]}" + fi + if (( nogui != 1 )); then + WINDOWID="" zenity --info --title="$msgtitle" --text="$msg" &> /dev/null & + zpid=$! + fi + if (( y > 0 )); then + echo "devmon: sync" + sync + for d in ${udrive[@]}; do + unmountdev $d + if [ "$?" != "0" ] && (( nogui != 1 )); then + driveinfo "$d" quiet + if [ "$label" = "" ]; then + lb="" + else + lb=" ($label)" + fi + msg="Unmount error on $d$lb:\n\n$uerrmsg" + WINDOWID="" zenity --error --title="$msgtitle" --text="$msg" &> /dev/null & + fi + done + echo "devmon: sync" + sync + fi + if [ "$zpid" != "" ]; then + sleep 2 + kill $zpid 2> /dev/null + fi + fi + + # Unmount Optical + if (( unmountoptical == 1 )); then + x=0 + while [ -e "/dev/sr$x" ]; do + if ( ignoredevice "/dev/sr$x" ); then + (( x++ )) + continue + fi + driveinfo /dev/sr$x + if ( ignorelabel "$label" ); then + (( x++ )) + continue + else + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" = "1" ] && \ + [ "$ismounted" = "1" ]; then + unmountdev /dev/sr$x + if [ "$?" != "0" ] && (( nogui != 1 )); then + if [ "$label" = "" ]; then + lb="" + else + lb=" ($label)" + fi + msg="Unmount error on /dev/sr$x$lb:\n\n$uerrmsg" + WINDOWID="" zenity --error --title="devmon unmount optical" \ + --text="$msg" &> /dev/null & + fi + fi + fi + (( x++ )) + done + fi + + # Unmount DIR|DEVICE + if (( umntx > 0 )); then + x=0 + while (( x < umntx )); do + d="${umnt[$x]}" + # remove trailing slash + if [ "$d" != "/" ]; then + d="${d%/}" + fi + if [ "${d:0:5}" = "/dev/" ]; then + # Unmount DEVICE + unmountdev "$d" + else + # Unmount DIR + if [ "$(dirname "$d")" = "." ]; then + if [ -d "$(pwd)/$d" ]; then + d="$(pwd)/$d" + elif [ -d "/media/$d" ]; then + d="/media/$d" + elif [ -e "/dev/$d" ] && [ "$(mount | grep "^/dev/$d on ")" != "" ]; then + unmountdev "/dev/$d" + (( x++ )) + continue + fi + fi + if [ ! -d "$d" ]; then + echo "devmon: No such directory or mounted device $d" 1>&2 + uerr=3 + else + dv=`mount | grep -m 1 " on $d type " | awk '{print $1}'` + if [ "$dv" = "" ]; then + echo "devmon: Nothing mounted on $d (mtab)" 1>&2 + uerr=3 + else + unmountdev "$dv" + fi + fi + fi + (( x++ )) + done + fi + + # Eject DIR|DEVICE + if (( ejx > 0 )); then + x=0 + while (( x < ejx )); do + d="${ej[$x]}" + # remove trailing slash + if [ "$d" != "/" ]; then + d="${d%/}" + fi + dv="" + if [ "${d:0:5}" = "/dev/" ]; then + # Eject DEVICE + dv="$d" + else + # Eject DIR + if [ "$(dirname "$d")" = "." ]; then + if [ -d "$(pwd)/$d" ]; then + d="$(pwd)/$d" + elif [ -d "/media/$d" ]; then + d="/media/$d" + elif [ -e "/dev/$d" ] && [ "$(mount | grep "^/dev/$d on ")" != "" ]; then + dv="/dev/$d" + fi + fi + if [ "$dv" = "" ]; then + if [ ! -d "$d" ]; then + echo "devmon: No such directory or mounted device $d" 1>&2 + uerr=3 + else + dv=`mount | grep -m 1 " on $d type " | awk '{print $1}'` + if [ "$dv" = "" ]; then + echo "devmon: Nothing mounted on $d (mtab)" 1>&2 + uerr=3 + fi + fi + fi + fi + if [ "$dv" != "" ]; then + driveinfo "$dv" + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" = "1" ] && \ + [ "$ismounted" = "1" ]; then + unmountdev "$dv" + fi + ejectdev "$dv" + fi + (( x++ )) + done + fi + + # Mount DEVICE + if (( mntx > 0 )); then + x=0 + while (( x < mntx )); do + d="${mnt[$x]}" + # remove trailing slash + if [ "$d" != "/" ]; then + d="${d%/}" + fi + if [ "$(dirname "$d")" = "." ] && [ "${d:0:5}" != "/dev/" ]; then + d="/dev/$d" + fi + driveinfo "$d" quiet + if [ "$opticaldisc" = "1" ]; then + mountdev $d "$label" + else + mountdev $d "$label" "$type" + fi + (( x++ )) + done + fi + + # Mount All Unmounted + if (( mountall == 1 )); then + mountalldrives + fi + + exit $uerr +fi + +# Daemon Mode +if [ "$mountfstype" != "" ]; then + echo "WARNING: --mount-fstype ignored in daemon mode" 1>&2 + mountfstype="" +fi +if [ "$unmountoptions" != "" ]; then + echo "WARNING: --unmount-options ignored in daemon mode" 1>&2 + unmountoptions="" +fi +if [ "$ejectoptions" != "" ]; then + echo "WARNING: --eject-options ignored in daemon mode" 1>&2 + ejectoptions="" +fi +pidcount=`ps h -C ${0//*\//} -o pid | wc -l` +if (( pidcount > 2 )); then + echo + echo "WARNING: multiple instances of devmon appear to be running" + echo +fi + +# Trigger udisks daemon start two ways +if [ -e /dev/sr0 ]; then + udisks --poll-for-media /dev/sr0 +fi +udisks --show-info /dev/sda > /dev/null +sleep 2 # helps successful sr0 startup mount on reboot + + +# Startup Mounting +if (( nomount != 1 )); then + mountalldrives +fi + +# Start monitoring +coproc udisks --monitor +err=$? +trap trapexit EXIT SIGINT SIGTERM SIGQUIT +trap "echo devmon: ignored HUP" SIGHUP + +if [ $err != "0" ] || [ ! ps -p $COPROC_PID &>/dev/null ]; then + echo "devmon: unable to start udisks --monitor" 1>&2 + echo " is udisks installed and dbus running?" 1>&2 + exit 2 +fi + + +# Monitoring Loop +while ps -p $COPROC_PID &>/dev/null; do + read -u ${COPROC[0]} + echo "===========================================" + echo "$REPLY" + event="${REPLY%:*}" + devpath="${REPLY#*:}" + devpath="/dev/${devpath##*/}" + if [ "$event" != "" ] && [ "$devpath" != "/dev/" ] && [ -e "$devpath" ]; then + case $event in + added ) + driveinfo $devpath + if [ "$systeminternal" != "1" ] && [ "$ismounted" = "0" ] && \ + [ "$nopolicy" != "1" ]; then + if [ "$usage" = "filesystem" ]; then + mountdrive $devpath "$label" "$type" + else + mountdrive $devpath "$label" nofs + fi + fi + ;; + job-changed ) + ;; + removed ) + ;; + changed ) + driveinfo $devpath + eval notejected=\$notejected${devpath#/dev/} + eval devmounted=\$devmounted${devpath#/dev/} + eval devmounted${devpath#/dev/}="$ismounted" + # If notejected==1 then cd has not been ejected and was probably + # manually unmounted, so don't automount it. Otherwise + # devmon will instantly mount any manual unmount. + if [ "$systeminternal" != "1" ] && [ "$opticaldisc" = "1" ] && \ + [ "$ismounted" != "1" ] && [ "$hasmedia" != "0" ] && \ + [ "$blank" != "1" ] && (( notejected != 1 )) && \ + [ "$nopolicy" != "1" ]; then + if [ "$media" = "optical_dvd" ]; then + mountdrive $devpath "$label" dvd + elif (( numaudiotracks > 0 )); then + mountdrive $devpath "$label" audiocd + else + mountdrive $devpath "$label" optical + fi + eval notejected${devpath#/dev/}=1 + else + if [ "$systeminternal" != "1" ] && \ + [ "$ismounted" != "1" ] && [ "$hasmedia" = "0" ]; then + # disc ejected + echo "devmon: $devpath eject detected" + eval notejected${devpath#/dev/}=0 + fi + if [ "$systeminternal" != "1" ] && [ "$ismounted" != "1" ] && \ + [ "$nopolicy" != "1" ] && [ "$devmounted" = "1" ]; then + # exec-on-unmount + if (( execoux != 0 )); then + if ( ! ignoredevice "$devpath" ) && ( ! ignorelabel "$label" ); then + dv="$devpath" + execcommands "exec on unmount" "${execou[@]}" + fi + fi + fi + fi + ;; + esac + elif [ "$event" = "removed" ]; then + eval unset devmounted${devpath#/dev/} + # exec-on-remove + if (( execorx != 0 )); then + if ( ! ignoredevice "$devpath" ); then + unset lb point + dv="$devpath" + execcommands "exec on remove" "${execor[@]}" + fi + fi + fi +done + +exit + +# CHANGELOG +# 1.0.5: --exec-on-unmount now executes only once per unmount +# 1.0.4: added --exec-on-unmount, --exec-on-remove +# added multiple instance warning +# %f device spec no longer passed in quotes to commands +# 1.0.3: help updated for sync +# corrected exec-on-drive bug introduced in 1.0.1 +# 1.0.2: --sync adds sync for ntfs +# 1.0.1: added --sync +# added --no-unmount; unmount-on-exit is now default +# obey UDISKS_PRESENTATION_NOPOLICY to inhibit automount +# added unmount-all error pop-ups +# 1.0.0: added --unmount-recent +# improved udisks mount info to stdout +# improved mount/unmount without apparent filesystem +# 0.9.5: ignore trailing slash in un/mount dir/dev specs +# attempt to mount no filesystem in case there is one +# 0.9.4: polkit error more selective +# 0.9.3: corrected problems with spaces in volume labels +# corrected un/mounting of partitionless devices +# corrected --ignore-devices problem +# added not authorized pop-up error +# 0.9.2: added --internal +# 0.9.1: corrected --unmount-on-removable not recognized +# 0.9.0: changed --unmount-all to --unmount-removable +# added --unmount-all (now includes optical) +# added --unmount-optical +# added --unmount DIR|DEVICE +# added --eject DIR|DEVICE +# added --mount-all +# added --mount DEVICE +# added --info-on-mount +# added pass options to udisks +# better error msg from udisks +# individual drive eject detection +# no limit on number of optical drives +# 0.8.2: more verbose errors +# run as root changed to warning +# 0.8.1: added --unmount-on-exit +# adjusted start daemon trigger, timing +# added 'do not run as root' catcher +# added trap to ignore SIGHUP + diff --git a/opensuse/core/tdebase/dont-always-start-kaccess.diff b/opensuse/core/tdebase/dont-always-start-kaccess.diff new file mode 100644 index 000000000..f50747274 --- /dev/null +++ b/opensuse/core/tdebase/dont-always-start-kaccess.diff @@ -0,0 +1,66 @@ +Index: kcontrol/access/kcmaccess.cpp +=================================================================== +--- kcontrol/access/kcmaccess.cpp.orig ++++ kcontrol/access/kcmaccess.cpp +@@ -103,10 +103,57 @@ void ExtendedIntNumInput::slotSliderValu + + static bool needToRunKAccessDaemon( KConfig *config ) + { +- // We always start the KAccess Daemon, if it is not needed, +- // it will terminate itself after configuring the AccessX +- // features. +- return true; ++ KConfigGroup bell( config, "Bell" ); ++ ++ if (!bell.readBoolEntry("SystemBell", true)) ++ return true; ++ if (bell.readBoolEntry("ArtsBell", false)) ++ return true; ++ if (bell.readBoolEntry("VisibleBell", false)) ++ return true; ++ ++ KConfigGroup keyboard( config, "Keyboard" ); ++ ++ if (keyboard.readBoolEntry("StickyKeys", false)) ++ return true; ++ if (keyboard.readBoolEntry("SlowKeys", false)) ++ return true; ++ if (keyboard.readBoolEntry("BounceKeys", false)) ++ return true; ++ if (keyboard.readBoolEntry("Gestures", true)) ++ return true; ++ // Find out whether the gestures are activated by default in the X configuration or not. ++ int major = XkbMajorVersion; ++ int minor = XkbMinorVersion; ++ if (XkbLibraryVersion(&major, &minor)) ++ { ++ int opcode_rtrn; ++ int error_rtrn; ++ int xkb_opcode; ++ if (XkbQueryExtension(qt_xdisplay(), &opcode_rtrn, &xkb_opcode, &error_rtrn, ++ &major, &minor)) ++ { ++ if(XkbDescPtr xkbdesc = XkbGetMap(qt_xdisplay(), 0, XkbUseCoreKbd)) ++ { ++ if(XkbGetControls(qt_xdisplay(), XkbAllControlsMask/*XkbAccessXKeysMask*/, xkbdesc ) == Success ) ++ { ++ if(xkbdesc->ctrls->enabled_ctrls & XkbAccessXKeysMask) ++ { ++ XkbFreeClientMap(xkbdesc,0,True); ++ return true; ++ } ++ } ++ XkbFreeClientMap(xkbdesc,0,True); ++ } ++ } ++ } ++ ++ KConfigGroup mouse( config, "Mouse" ); ++ ++ if (mouse.readBoolEntry("MouseKeys", false)) ++ return true; ++ ++ return false; // don't need it + } + + QString mouseKeysShortcut (Display *display) { diff --git a/opensuse/core/tdebase/fileshareset.8.gz b/opensuse/core/tdebase/fileshareset.8.gz Binary files differnew file mode 100644 index 000000000..c311d10b3 --- /dev/null +++ b/opensuse/core/tdebase/fileshareset.8.gz diff --git a/opensuse/core/tdebase/fileshareset2.tar.bz2 b/opensuse/core/tdebase/fileshareset2.tar.bz2 Binary files differnew file mode 100644 index 000000000..5e26bb796 --- /dev/null +++ b/opensuse/core/tdebase/fileshareset2.tar.bz2 diff --git a/opensuse/core/tdebase/fix-desktop-icons.diff b/opensuse/core/tdebase/fix-desktop-icons.diff new file mode 100644 index 000000000..27d83f685 --- /dev/null +++ b/opensuse/core/tdebase/fix-desktop-icons.diff @@ -0,0 +1,250 @@ +Index: kcontrol/componentchooser/componentchooser.desktop +=================================================================== +--- kcontrol/componentchooser/componentchooser.desktop.orig ++++ kcontrol/componentchooser/componentchooser.desktop +@@ -1,6 +1,6 @@ + [Desktop Entry] + Exec=kcmshell componentchooser +-Icon=misc ++Icon=kcmcomponentchooser + Type=Application + + +Index: kcontrol/taskbar/kcmtaskbar.desktop +=================================================================== +--- kcontrol/taskbar/kcmtaskbar.desktop.orig ++++ kcontrol/taskbar/kcmtaskbar.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=kmenu ++Icon=kcmtaskbar + Type=Application + DocPath=kcontrol/kcmtaskbar/index.html + Exec=kcmshell kcmtaskbar +Index: kcontrol/nics/nic.desktop +=================================================================== +--- kcontrol/nics/nic.desktop.orig ++++ kcontrol/nics/nic.desktop +@@ -2,7 +2,7 @@ + Exec=kcmshell nic + Type=Application + DocPath=kinfocenter/nics/index.html +-Icon=network ++Icon=kcmnic + + + X-KDE-Library=nic +Index: kcontrol/input/mouse.desktop +=================================================================== +--- kcontrol/input/mouse.desktop.orig ++++ kcontrol/input/mouse.desktop +@@ -1,6 +1,6 @@ + [Desktop Entry] + Exec=kcmshell mouse +-Icon=mouse ++Icon=kcmmouse + Type=Application + DocPath=kcontrol/mouse/index.html + +Index: kcontrol/smserver/kcmsmserver.desktop +=================================================================== +--- kcontrol/smserver/kcmsmserver.desktop.orig ++++ kcontrol/smserver/kcmsmserver.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=exit ++Icon=kcmsmserver + Type=Application + DocPath=kcontrol/kcmsmserver/index.html + Exec=kcmshell kcmsmserver +Index: kcontrol/kded/kcmkded.desktop +=================================================================== +--- kcontrol/kded/kcmkded.desktop.orig ++++ kcontrol/kded/kcmkded.desktop +@@ -1,6 +1,6 @@ + [Desktop Entry] + Exec=kcmshell kcmkded +-Icon=services ++Icon=kcmkded + Type=Application + + +Index: kcontrol/konq/desktop.desktop +=================================================================== +--- kcontrol/konq/desktop.desktop.orig ++++ kcontrol/konq/desktop.desktop +@@ -1,7 +1,7 @@ + [Desktop Entry] + Type=Application + DocPath=kcontrol/desktop/index.html#desktop-number +-Icon=desktop ++Icon=kcmdesktop + Exec=kcmshell desktop + + +Index: kcontrol/konq/desktopbehavior.desktop +=================================================================== +--- kcontrol/konq/desktopbehavior.desktop.orig ++++ kcontrol/konq/desktopbehavior.desktop +@@ -1,7 +1,7 @@ + [Desktop Entry] + Type=Application + DocPath=kcontrol/desktopbehavior/index.html +-Icon=desktop ++Icon=kcmdesktopbehavior + Exec=kcmshell desktopbehavior + + +Index: kcontrol/privacy/privacy.desktop +=================================================================== +--- kcontrol/privacy/privacy.desktop.orig ++++ kcontrol/privacy/privacy.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=trashcan_empty ++Icon=kcmprivacy + Comment=Privacy - a kcontrol module to clean unwanted traces the user leaves on the system + Comment[af]=Privaatheid - 'n Beheer module wat voetspore wat deur gebruikers op die stelsel gelaat word skoon maak + Comment[ar]=الخصوصية - ÙˆØدة kcontrol لتنظي٠الآثار غير المرغوب بها التي يتركها المستخدم على النظام +Index: kcontrol/crypto/crypto.desktop +=================================================================== +--- kcontrol/crypto/crypto.desktop.orig ++++ kcontrol/crypto/crypto.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=encrypted ++Icon=kcmcrypto + Type=Application + Exec=kcmshell crypto + DocPath=kcontrol/crypto/index.html +Index: kcontrol/kio/netpref.desktop +=================================================================== +--- kcontrol/kio/netpref.desktop.orig ++++ kcontrol/kio/netpref.desktop +@@ -76,7 +76,7 @@ Comment[zh_CN]=é…置通用网络首选é + Comment[zh_TW]=è¨å®šä¸€èˆ¬ç¶²è·¯å–œå¥½è¨å®šï¼Œä¾‹å¦‚逾時值 + Comment[zu]=Hlanganisela okuncanyelwa uwonkewonke koxhumano olusazekile, njengamanani esikhathi sokuphuma + Exec=kcmshell netpref +-Icon=network ++Icon=kcmnetpref + Keywords=timeout,iopref,netpref,network preferences,ftp + Keywords[be]=ТÑрмін чаканнÑ,УлаÑціваÑці Ñеткі,timeout,iopref,netpref,network preferences,ftp + Keywords[bg]=проÑрочка, време, времето, пауза, прекъÑване, връзка, timeout, iopref, netpref, network preferences, ftp +Index: kcontrol/konqhtml/khtml_filter.desktop +=================================================================== +--- kcontrol/konqhtml/khtml_filter.desktop.orig ++++ kcontrol/konqhtml/khtml_filter.desktop +@@ -1,7 +1,7 @@ + [Desktop Entry] + Type=Application + DocPath=kcontrol/khtml/index.html#khtml-adblock +-Icon=filter ++Icon=kcmkhtml_filter + Exec=kcmshell khtml_filter + + X-KDE-Library=konqhtml +Index: kcontrol/joystick/joystick.desktop +=================================================================== +--- kcontrol/joystick/joystick.desktop.orig ++++ kcontrol/joystick/joystick.desktop +@@ -173,5 +173,5 @@ Type=Application + X-KDE-FactoryName=kcm_joystick + X-KDE-Library=joystick + X-KDE-Test-Module=true +-Icon=joystick ++Icon=kcmjoystick + Categories=Qt;KDE;X-KDE-settings-hardware; +Index: kcontrol/colors/colors.desktop +=================================================================== +--- kcontrol/colors/colors.desktop.orig ++++ kcontrol/colors/colors.desktop +@@ -1,6 +1,6 @@ + [Desktop Entry] + Exec=kcmshell colors +-Icon=colorscm ++Icon=kcmcolors + Type=Application + DocPath=kcontrol/colors/index.html + +Index: kcontrol/performance/kcmperformance.desktop +=================================================================== +--- kcontrol/performance/kcmperformance.desktop.orig ++++ kcontrol/performance/kcmperformance.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=launch ++Icon=kcmperformance + Type=Application + Exec=kcmshell kcmperformance + +Index: kcontrol/launch/kcmlaunch.desktop +=================================================================== +--- kcontrol/launch/kcmlaunch.desktop.orig ++++ kcontrol/launch/kcmlaunch.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=launch ++Icon=kcmlaunch + Type=Application + DocPath=kcontrol/kcmlaunch/index.html + Exec=kcmshell kcmlaunch +Index: kcontrol/dnssd/kcm_kdnssd.desktop +=================================================================== +--- kcontrol/dnssd/kcm_kdnssd.desktop.orig ++++ kcontrol/dnssd/kcm_kdnssd.desktop +@@ -70,7 +70,7 @@ Comment[zh_TW]=è¨å®šæœå‹™åµæ¸¬ + Exec=kcmshell kcm_kdnssd + GenericName= + GenericName[ko]=ì¼ë°˜ +-Icon=blockdevice ++Icon=kcmkdnssd + MimeType= + Name=Service Discovery + Name[af]=Dienste ontdekker +Index: kcontrol/spellchecking/spellchecking.desktop +=================================================================== +--- kcontrol/spellchecking/spellchecking.desktop.orig ++++ kcontrol/spellchecking/spellchecking.desktop +@@ -1,6 +1,6 @@ + [Desktop Entry] + Exec=kcmshell spellchecking +-Icon=spellcheck ++Icon=kcmspellchecking + Type=Application + DocPath=kcontrol/spellchecking/index.html + +Index: konqueror/sidebar/trees/history_module/kcmhistory.desktop +=================================================================== +--- konqueror/sidebar/trees/history_module/kcmhistory.desktop.orig ++++ konqueror/sidebar/trees/history_module/kcmhistory.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=history ++Icon=kcmhistory + Type=Application + Exec=kcmshell kcmhistory + +Index: kioslave/cgi/kcmcgi/kcmcgi.desktop +=================================================================== +--- kioslave/cgi/kcmcgi/kcmcgi.desktop.orig ++++ kioslave/cgi/kcmcgi/kcmcgi.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Icon=run ++Icon=kcmcgi + Type=Application + Exec=kcmshell kcmcgi + DocPath= +Index: kioslave/media/kcmodule/media.desktop +=================================================================== +--- kioslave/media/kcmodule/media.desktop.orig ++++ kioslave/media/kcmodule/media.desktop +@@ -1,7 +1,7 @@ + [Desktop Entry] + Type=Application + #DocPath= +-Icon=system ++Icon=kcmmedia + Exec=kcmshell media + + diff --git a/opensuse/core/tdebase/fix-kcontrol-yast.diff b/opensuse/core/tdebase/fix-kcontrol-yast.diff new file mode 100644 index 000000000..5902d904d --- /dev/null +++ b/opensuse/core/tdebase/fix-kcontrol-yast.diff @@ -0,0 +1,63 @@ +Index: kcontrol/kcontrol/modules.cpp +=================================================================== +--- kcontrol/kcontrol/modules.cpp.orig ++++ kcontrol/kcontrol/modules.cpp +@@ -19,6 +19,7 @@ + + #include <unistd.h> + #include <sys/types.h> ++#include <stdlib.h> + + + #include <qlabel.h> +@@ -59,6 +60,10 @@ ConfigModule::~ConfigModule() + + ProxyWidget *ConfigModule::module() + { ++ KDesktopFile kd(service()->desktopEntryPath()); ++ if ( !kd.readEntry("X-SuSE-YaST-Call").isEmpty() ) ++ setenv("KCMYAST2_CALL", kd.readEntry("X-SuSE-YaST-Call").latin1(), 1 ); ++ + if (_module) + return _module; + +@@ -168,6 +173,7 @@ void ConfigModule::runAsRoot() + // prepare the process to run the kcmshell + QString cmd = service()->exec().stripWhiteSpace(); + bool kdeshell = false; ++ bool proxy = false; + if (cmd.left(5) == "kdesu") + { + cmd = cmd.remove(0,5).stripWhiteSpace(); +@@ -185,6 +191,15 @@ void ConfigModule::runAsRoot() + kdeshell = true; + } + ++ KDesktopFile kd(service()->desktopEntryPath()); ++ if ( !kd.readEntry("X-SuSE-YaST-Call").isEmpty() ){ ++ kdeshell = true; ++ proxy = true; ++ cmd=service()->desktopEntryPath(); ++ ++ setenv("KCMYAST2_CALL", kd.readEntry("X-SuSE-YaST-Call").latin1(), 1 ); ++ } ++ + // run the process + QString kdesu = KStandardDirs::findExe("kdesu"); + if (!kdesu.isEmpty()) +@@ -196,12 +211,12 @@ void ConfigModule::runAsRoot() + // in that case the modules is started through kdesud and kdesu + // returns before the module is running and that doesn't work. + // We also don't have a way to close the module in that case. +- *_rootProcess << "--n"; // Don't keep password. ++ *_rootProcess << "--n" << "-t"; // Don't keep password. + if (kdeshell) { +- *_rootProcess << QString("%1 %2 --embed %3 --lang %4").arg(locate("exe", "kcmshell")).arg(cmd).arg(_embedWidget->winId()).arg(KGlobal::locale()->language()); ++ *_rootProcess << QString("%1 %2 %3 %4 --lang %5").arg(locate("exe", "kcmshell")).arg(cmd).arg(proxy?"--embed-proxy":"--embed").arg(_embedWidget->winId()).arg(KGlobal::locale()->language()); + } + else { +- *_rootProcess << QString("%1 --embed %2 --lang %3").arg(cmd).arg(_embedWidget->winId()).arg( KGlobal::locale()->language() ); ++ *_rootProcess << QString("%1 %2 %3 --lang %4").arg(cmd).arg(proxy?"--embed-proxy":"--embed").arg(_embedWidget->winId()).arg( KGlobal::locale()->language() ); + } + + connect(_rootProcess, SIGNAL(processExited(KProcess*)), this, SLOT(rootExited(KProcess*))); diff --git a/opensuse/core/tdebase/fix-kio-smb-auth.diff b/opensuse/core/tdebase/fix-kio-smb-auth.diff new file mode 100644 index 000000000..d591be038 --- /dev/null +++ b/opensuse/core/tdebase/fix-kio-smb-auth.diff @@ -0,0 +1,13 @@ +? kioslave/smb/kio_smb_la_all_cpp.cpp +Index: kioslave/smb/kio_smb_auth.cpp +=================================================================== +--- kioslave/smb/kio_smb_auth.cpp.orig ++++ kioslave/smb/kio_smb_auth.cpp +@@ -144,6 +144,7 @@ bool SMBSlave::checkPassword(SMBUrl &url + if ( openPassDlg(info) ) { + kdDebug(KIO_SMB) << "openPassDlg returned " << info.username << endl; + url.setUser(info.username); ++ url.setPass(info.password); + return true; + } + kdDebug(KIO_SMB) << "no value from openPassDlg\n"; diff --git a/opensuse/core/tdebase/fix-lockup-from-gnome-apps.diff b/opensuse/core/tdebase/fix-lockup-from-gnome-apps.diff new file mode 100644 index 000000000..05fc4313b --- /dev/null +++ b/opensuse/core/tdebase/fix-lockup-from-gnome-apps.diff @@ -0,0 +1,20 @@ +Index: khelpcenter/navigator.cpp +=================================================================== +--- khelpcenter/navigator.cpp.orig ++++ khelpcenter/navigator.cpp +@@ -333,9 +333,14 @@ void Navigator::selectItem( const KURL & + // First, populate the NavigatorAppItems if we don't want the home page + if ( url != homeURL() ) { + for ( QListViewItem *item = mContentsTree->firstChild(); item; +- item = item->nextSibling() ) { ++ item = item->nextSibling() ) { + NavigatorAppItem *appItem = dynamic_cast<NavigatorAppItem *>( item ); + if ( appItem ) appItem->populate( true /* recursive */ ); ++ for ( QListViewItem *subitem = item->firstChild(); subitem; ++ subitem = subitem->nextSibling() ) { ++ appItem = dynamic_cast<NavigatorAppItem *>( subitem ); ++ if ( appItem ) appItem->populate( true /* recursive */ ); ++ } + } + } + diff --git a/opensuse/core/tdebase/fix_default_theme_reset.diff b/opensuse/core/tdebase/fix_default_theme_reset.diff new file mode 100644 index 000000000..2b2a6805a --- /dev/null +++ b/opensuse/core/tdebase/fix_default_theme_reset.diff @@ -0,0 +1,59 @@ +Index: kcontrol/kthememanager/ktheme.cpp +=================================================================== +--- kcontrol/kthememanager/ktheme.cpp.orig ++++ kcontrol/kthememanager/ktheme.cpp +@@ -188,11 +188,11 @@ QString KTheme::createYourself( bool pac + globalConf->setGroup( "Icons" ); + QDomElement iconElem = m_dom.createElement( "icons" ); + iconElem.setAttribute( "name", globalConf->readEntry( "Theme",KIconTheme::current() ) ); +- createIconElems( "DesktopIcons", "desktop", iconElem, globalConf ); +- createIconElems( "MainToolbarIcons", "mainToolbar", iconElem, globalConf ); +- createIconElems( "PanelIcons", "panel", iconElem, globalConf ); +- createIconElems( "SmallIcons", "small", iconElem, globalConf ); +- createIconElems( "ToolbarIcons", "toolbar", iconElem, globalConf ); ++ createIconElems( "DesktopIcons", "desktop", 32, iconElem, globalConf ); ++ createIconElems( "MainToolbarIcons", "mainToolbar", 22, iconElem, globalConf ); ++ createIconElems( "PanelIcons", "panel", 32, iconElem, globalConf ); ++ createIconElems( "SmallIcons", "small", 16, iconElem, globalConf ); ++ createIconElems( "ToolbarIcons", "toolbar", 22, iconElem, globalConf ); + m_root.appendChild( iconElem ); + + // 4. Sounds +@@ -726,7 +726,7 @@ QString KTheme::getProperty( QDomElement + } + + void KTheme::createIconElems( const QString & group, const QString & object, +- QDomElement parent, KConfig * cfg ) ++ int defsize, QDomElement parent, KConfig * cfg ) + { + cfg->setGroup( group ); + QStringList elemNames; +@@ -745,7 +745,9 @@ void KTheme::createIconElems( const QStr + QDomElement tmpCol = m_dom.createElement( *it ); + tmpCol.setAttribute( "object", object ); + +- if ( (*it).contains( "Value" ) || *it == "Size" ) ++ if ( *it == "Size" ) ++ tmpCol.setAttribute( "value", cfg->readNumEntry( *it, defsize ) ); ++ else if ( (*it).contains( "Value" )) + tmpCol.setAttribute( "value", cfg->readNumEntry( *it, 1 ) ); + else if ( (*it).contains( "DisabledEffect" ) ) + tmpCol.setAttribute( "name", cfg->readEntry( *it, "togray" ) ); +Index: kcontrol/kthememanager/ktheme.h +=================================================================== +--- kcontrol/kthememanager/ktheme.h.orig ++++ kcontrol/kthememanager/ktheme.h +@@ -155,11 +155,12 @@ private: + * Creates a list of "icon" elements based on: + * @param group The group in the KConfig object @p cfg + * @param object Specifier (similiar, but not identical to @p group) ++ * @param defsize default icon size + * @param parent Parent element to append to + * @param cfg The KConfig object to work with + */ + void createIconElems( const QString & group, const QString & object, +- QDomElement parent, KConfig * cfg ); ++ int defsize, QDomElement parent, KConfig * cfg ); + + /** + * Creates a color DOM element @p name, with a specifier @p object, diff --git a/opensuse/core/tdebase/gcc44.diff b/opensuse/core/tdebase/gcc44.diff new file mode 100644 index 000000000..999b5f3ca --- /dev/null +++ b/opensuse/core/tdebase/gcc44.diff @@ -0,0 +1,20 @@ +--- kcontrol/kfontinst/kfontinst/Fontmap.cpp.sav 2006-01-19 18:00:49.000000000 +0100 ++++ kcontrol/kfontinst/kfontinst/Fontmap.cpp 2009-05-29 14:50:08.000000000 +0200 +@@ -44,7 +44,7 @@ + + using namespace std; + +-static char * findSpace(char *str) ++static const char * findSpace(const char *str) + { + while(str && *str!=' ' && *str!='\t') + str++; +@@ -65,7 +65,7 @@ static bool parseLine(const char *line, + char a[constMaxLen+1], + b[constFileMaxLen+1]; + +- char *slash1=strchr(line, '/'), ++ const char *slash1=strchr(line, '/'), + *space1=slash1 ? findSpace(slash1) : NULL, //strchr(slash1, ' ') : NULL, + *ob=slash1 ? strchr(slash1, '(') : NULL, + *cb=ob ? strchr(ob, ')') : NULL, diff --git a/opensuse/core/tdebase/hide-only-showin-entries.diff b/opensuse/core/tdebase/hide-only-showin-entries.diff new file mode 100644 index 000000000..f403d38c5 --- /dev/null +++ b/opensuse/core/tdebase/hide-only-showin-entries.diff @@ -0,0 +1,14 @@ +Index: konqueror/konq_mainwindow.cc +=================================================================== +--- konqueror/konq_mainwindow.cc.orig ++++ konqueror/konq_mainwindow.cc +@@ -4926,6 +4926,9 @@ void KonqMainWindow::updateOpenWithActio + KTrader::OfferList::ConstIterator end = services.end(); + for (; it != end; ++it ) + { ++ if ( (*it)->noDisplay() ) ++ continue; ++ + KAction *action = new KAction( i18n( "Open with %1" ).arg( (*it)->name() ), 0, 0, (*it)->desktopEntryName().latin1() ); + action->setIcon( (*it)->icon() ); + diff --git a/opensuse/core/tdebase/improve-panelservicemenu-geticonset.diff b/opensuse/core/tdebase/improve-panelservicemenu-geticonset.diff new file mode 100644 index 000000000..842976d5a --- /dev/null +++ b/opensuse/core/tdebase/improve-panelservicemenu-geticonset.diff @@ -0,0 +1,32 @@ +Index: kicker/libkicker/global.cpp +=================================================================== +--- kicker/libkicker/global.cpp.orig ++++ kicker/libkicker/global.cpp +@@ -425,6 +425,12 @@ QIconSet menuIconSet(const QString& icon + KIcon::ActiveState, + 0, + true); ++ QPixmap disabled = KGlobal::iconLoader()->loadIcon(icon, ++ KIcon::Small, ++ 0, ++ KIcon::DisabledState, ++ 0, ++ true); + + // make sure they are not larger than 20x20 + if (normal.width() > 20 || normal.height() > 20) +@@ -437,8 +443,14 @@ QIconSet menuIconSet(const QString& icon + active.convertFromImage(active.convertToImage().smoothScale(20,20)); + } + ++ if (disabled.width() > 20 || disabled.height() > 20) ++ { ++ disabled.convertFromImage(disabled.convertToImage().smoothScale(20,20)); ++ } ++ + iconset.setPixmap(normal, QIconSet::Small, QIconSet::Normal); + iconset.setPixmap(active, QIconSet::Small, QIconSet::Active); ++ iconset.setPixmap(disabled, QIconSet::Small, QIconSet::Disabled); + } + } + diff --git a/opensuse/core/tdebase/ioslaveinfo-icon.diff b/opensuse/core/tdebase/ioslaveinfo-icon.diff new file mode 100644 index 000000000..5f64f89d9 --- /dev/null +++ b/opensuse/core/tdebase/ioslaveinfo-icon.diff @@ -0,0 +1,13 @@ +Index: kcontrol/ioslaveinfo/ioslaveinfo.desktop +=================================================================== +--- kcontrol/ioslaveinfo/ioslaveinfo.desktop.orig ++++ kcontrol/ioslaveinfo/ioslaveinfo.desktop +@@ -79,7 +79,7 @@ Comment[zh_TW]=å¯ç”¨å”定的資訊 + Comment[zu]=Ulwazi mayelana nemithetho elandelwayo ekhona + DocPath=kinfocenter/protocols/index.html + Exec=kcmshell ioslaveinfo +-Icon=history ++Icon=enhanced_browsing + Keywords=Protocol,IO slaves,Slaves,Network,Information,Timeout + Keywords[ar]=الميÙاق,IO Slaves,Slaves,الشبكة,معلومات Ù†Ùاذ الوقت + Keywords[az]=Protokol, IO KölÉ™lÉ™ri, KölÉ™lÉ™r, ŞəbÉ™kÉ™,MÉ™'lumat, Vaxt Dolması diff --git a/opensuse/core/tdebase/kcheckpass-pam-11.0 b/opensuse/core/tdebase/kcheckpass-pam-11.0 new file mode 100644 index 000000000..eae973612 --- /dev/null +++ b/opensuse/core/tdebase/kcheckpass-pam-11.0 @@ -0,0 +1,6 @@ +#%PAM-1.0 +auth include common-auth +account include common-account +password include common-password +session include common-session +session required pam_resmgr.so diff --git a/opensuse/core/tdebase/kcheckpass-pam-11.1 b/opensuse/core/tdebase/kcheckpass-pam-11.1 new file mode 100644 index 000000000..c6a7c9c90 --- /dev/null +++ b/opensuse/core/tdebase/kcheckpass-pam-11.1 @@ -0,0 +1,5 @@ +#%PAM-1.0 +auth include common-auth +account include common-account +password include common-password +session include common-session diff --git a/opensuse/core/tdebase/kcheckpass-pam-legacy b/opensuse/core/tdebase/kcheckpass-pam-legacy new file mode 100644 index 000000000..87df34589 --- /dev/null +++ b/opensuse/core/tdebase/kcheckpass-pam-legacy @@ -0,0 +1,7 @@ +#%PAM-1.0 +auth include common-auth +account include common-account +password include common-password +session include common-session +session required pam_devperm.so +session required pam_resmgr.so diff --git a/opensuse/core/tdebase/kcheckpass.8.gz b/opensuse/core/tdebase/kcheckpass.8.gz Binary files differnew file mode 100644 index 000000000..81f8aae2a --- /dev/null +++ b/opensuse/core/tdebase/kcheckpass.8.gz diff --git a/opensuse/core/tdebase/kcminit-ignore-arts.diff b/opensuse/core/tdebase/kcminit-ignore-arts.diff new file mode 100644 index 000000000..2c987aae1 --- /dev/null +++ b/opensuse/core/tdebase/kcminit-ignore-arts.diff @@ -0,0 +1,14 @@ +Index: kcminit/main.cpp +=================================================================== +--- kcminit/main.cpp.orig ++++ kcminit/main.cpp +@@ -98,6 +98,9 @@ void KCMInit::runModules( int phase ) + if (library.isEmpty()) + library = service->library(); + ++ if (library == "arts" && list.size() > 1) ++ continue; ++ + if (library.isEmpty() || service->init().isEmpty()) + continue; // Skip + diff --git a/opensuse/core/tdebase/kcmkdm-default-grub.diff b/opensuse/core/tdebase/kcmkdm-default-grub.diff new file mode 100644 index 000000000..1d758eb57 --- /dev/null +++ b/opensuse/core/tdebase/kcmkdm-default-grub.diff @@ -0,0 +1,13 @@ +Index: kcontrol/kdm/kdm-shut.cpp +=================================================================== +--- kcontrol/kdm/kdm-shut.cpp.orig ++++ kcontrol/kdm/kdm-shut.cpp +@@ -90,7 +90,7 @@ KDMSessionsWidget::KDMSessionsWidget(QWi + QGroupBox *group4 = new QGroupBox( i18n("Miscellaneous"), this ); + + bm_combo = new KBackedComboBox( group4 ); +- bm_combo->insertItem("None", i18n("boot manager", "None")); ++ bm_combo->insertItem("None", i18n("boot manager", "Grub")); + bm_combo->insertItem("Grub", i18n("Grub")); + #if defined(__linux__) && ( defined(__i386__) || defined(__amd64__) ) + bm_combo->insertItem("Lilo", i18n("Lilo")); diff --git a/opensuse/core/tdebase/kcmsamba_log.diff b/opensuse/core/tdebase/kcmsamba_log.diff new file mode 100644 index 000000000..e29ca1e13 --- /dev/null +++ b/opensuse/core/tdebase/kcmsamba_log.diff @@ -0,0 +1,31 @@ +Index: kcontrol/samba/kcmsambalog.cpp +=================================================================== +--- kcontrol/samba/kcmsambalog.cpp.orig ++++ kcontrol/samba/kcmsambalog.cpp +@@ -39,7 +39,7 @@ LogView::LogView(QWidget *parent,KConfig + ,configFile(config) + ,filesCount(0) + ,connectionsCount(0) +-,logFileName("/var/log/samba.log",this) ++,logFileName("/var/log/samba/log.smbd",this) + ,label(&logFileName,i18n("Samba log file: "),this) + ,viewHistory(this) + ,showConnOpen(i18n("Show opened connections"),this) +@@ -88,7 +88,7 @@ LogView::LogView(QWidget *parent,KConfig + " on this page. The log file (shown above) will be read to obtain the" + " events logged by samba.") ); + +- logFileName.setURL("/var/log/samba.log"); ++ logFileName.setURL("/var/log/samba/log.smbd"); + + viewHistory.setAllColumnsShowFocus(TRUE); + viewHistory.setFocusPolicy(QWidget::ClickFocus); +@@ -130,7 +130,7 @@ void LogView::loadSettings() + { + if (configFile==0) return; + configFile->setGroup(LOGGROUPNAME); +- logFileName.setURL(configFile->readPathEntry( "SambaLogFile", "/var/log/samba.log")); ++ logFileName.setURL(configFile->readPathEntry( "SambaLogFile", "/var/log/samba/log.smbd")); + + showConnOpen.setChecked(configFile->readBoolEntry( "ShowConnectionOpen", TRUE)); + showConnClose.setChecked(configFile->readBoolEntry( "ShowConnectionClose", FALSE)); diff --git a/opensuse/core/tdebase/kcmshell_use_kde-sound.diff b/opensuse/core/tdebase/kcmshell_use_kde-sound.diff new file mode 100644 index 000000000..ac6d434e4 --- /dev/null +++ b/opensuse/core/tdebase/kcmshell_use_kde-sound.diff @@ -0,0 +1,11 @@ +Index: kcontrol/info/sound.desktop +=================================================================== +--- kcontrol/info/sound.desktop.orig ++++ kcontrol/info/sound.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Exec=kcmshell sound ++Exec=kcmshell kde-sound + Icon=kcmsound + Type=Application + DocPath=kinfocenter/sound/index.html diff --git a/opensuse/core/tdebase/kcontrol-energy.diff b/opensuse/core/tdebase/kcontrol-energy.diff new file mode 100644 index 000000000..b98a648bc --- /dev/null +++ b/opensuse/core/tdebase/kcontrol-energy.diff @@ -0,0 +1,167 @@ +Index: kcontrol/energy/energy.h +=================================================================== +--- kcontrol/energy/energy.h.orig ++++ kcontrol/energy/energy.h +@@ -44,6 +44,7 @@ private slots: + void slotChangeStandby(int); + void slotChangeSuspend(int); + void slotChangeOff(int); ++ void slotLaunchKPowersave(); + void openURL(const QString &); + + private: +@@ -54,7 +55,7 @@ private: + static void applySettings(bool, int, int, int); + friend void init_energy(); + +- bool m_bChanged, m_bDPMS, m_bEnabled, m_bMaintainSanity; ++ bool m_bChanged, m_bDPMS, m_bKPowersave, m_bEnabled, m_bMaintainSanity; + int m_Standby, m_Suspend, m_Off; + int m_StandbyDesired, m_SuspendDesired, m_OffDesired; + +Index: kcontrol/energy/energy.cpp +=================================================================== +--- kcontrol/energy/energy.cpp.orig ++++ kcontrol/energy/energy.cpp +@@ -26,6 +26,7 @@ + #include <qlabel.h> + #include <qlayout.h> + #include <qwhatsthis.h> ++#include <qpushbutton.h> + + #include <kconfig.h> + #include <kcursor.h> +@@ -36,6 +37,7 @@ + #include <krun.h> + #include <kstandarddirs.h> + #include <kurllabel.h> ++#include <dcopref.h> + + #include <X11/X.h> + #include <X11/Xlib.h> +@@ -140,6 +142,7 @@ KEnergy::KEnergy(QWidget *parent, const + m_Suspend = DFLT_SUSPEND; + m_Off = DFLT_OFF; + m_bDPMS = false; ++ m_bKPowersave = false; + m_bMaintainSanity = true; + + setQuickHelp( i18n("<h1>Display Power Control</h1> If your display supports" +@@ -154,6 +157,13 @@ KEnergy::KEnergy(QWidget *parent, const + #ifdef HAVE_DPMS + int dummy; + m_bDPMS = DPMSQueryExtension(qt_xdisplay(), &dummy, &dummy); ++ ++ DCOPRef kpowersave("kpowersave", "KPowersaveIface"); ++ DCOPReply managingDPMS = kpowersave.call("currentSchemeManagesDPMS()"); ++ if (managingDPMS.isValid()) { ++ m_bKPowersave = managingDPMS; ++ m_bDPMS = !m_bKPowersave; ++ } + #endif + + QVBoxLayout *top = new QVBoxLayout(this, 0, KDialog::spacingHint()); +@@ -162,14 +172,26 @@ KEnergy::KEnergy(QWidget *parent, const + + QLabel *lbl; + if (m_bDPMS) { +- m_pCBEnable= new QCheckBox(i18n("&Enable display power management" ), this); +- connect(m_pCBEnable, SIGNAL(toggled(bool)), SLOT(slotChangeEnable(bool))); +- hbox->addWidget(m_pCBEnable); ++ KGlobal::locale()->insertCatalogue("kpowersave"); ++ ++ // ### these i18n strings need to be synced with kpowersave !! ++ m_pCBEnable= new QCheckBox(i18n("&Enable display power management" ), this); ++ connect(m_pCBEnable, SIGNAL(toggled(bool)), SLOT(slotChangeEnable(bool))); ++ hbox->addWidget(m_pCBEnable); + QWhatsThis::add( m_pCBEnable, i18n("Check this option to enable the" +- " power saving features of your display.") ); +- } else { ++ " power saving features of your display.") ); ++ ++ // ### ++ } else if(m_bKPowersave) { ++ m_pCBEnable = new QCheckBox(i18n("&Enable specific display power management"), this); ++ hbox->addWidget(m_pCBEnable); ++ m_bEnabled = false; ++ m_pCBEnable->setChecked(true); ++ m_pCBEnable->setEnabled(false); ++ ++ } else { + lbl = new QLabel(i18n("Your display does not support power saving."), this); +- hbox->addWidget(lbl); ++ hbox->addWidget(lbl); + } + + KURLLabel *logo = new KURLLabel(this); +@@ -183,6 +205,7 @@ connect(logo, SIGNAL(leftClickedURL(cons + hbox->addWidget(logo); + + // Sliders ++ if (!m_bKPowersave) { + m_pStandbySlider = new KIntNumInput(m_Standby, this); + m_pStandbySlider->setLabel(i18n("&Standby after:")); + m_pStandbySlider->setRange(0, 120, 10); +@@ -218,6 +241,17 @@ connect(logo, SIGNAL(leftClickedURL(cons + " greatest level of power saving that can be achieved while the" + " display is still physically turned on.") ); + ++ } ++ else { ++ m_pStandbySlider = 0; ++ m_pSuspendSlider = 0; ++ m_pOffSlider = 0; ++ QPushButton* btnKPowersave = new QPushButton(this); ++ btnKPowersave->setText(i18n("Configure KPowersave...")); ++ connect(btnKPowersave, SIGNAL(clicked()), SLOT(slotLaunchKPowersave())); ++ top->addWidget(btnKPowersave); ++ } ++ + top->addStretch(); + + if (m_bDPMS) +@@ -270,7 +304,8 @@ void KEnergy::defaults() + + void KEnergy::readSettings() + { +- m_bEnabled = m_pConfig->readBoolEntry("displayEnergySaving", false); ++ if (m_bDPMS) ++ m_bEnabled = m_pConfig->readBoolEntry("displayEnergySaving", false); + m_Standby = m_pConfig->readNumEntry("displayStandby", DFLT_STANDBY); + m_Suspend = m_pConfig->readNumEntry("displaySuspend", DFLT_SUSPEND); + m_Off = m_pConfig->readNumEntry("displayPowerOff", DFLT_OFF); +@@ -297,20 +332,27 @@ void KEnergy::writeSettings() + m_bChanged = false; + } + ++void KEnergy::slotLaunchKPowersave() ++{ ++ DCOPRef r("kpowersave", "KPowersaveIface"); ++ r.send("openConfigureDialog()"); ++} + + void KEnergy::showSettings() + { + m_bMaintainSanity = false; + + if (m_bDPMS) +- m_pCBEnable->setChecked(m_bEnabled); ++ m_pCBEnable->setChecked(m_bEnabled); + +- m_pStandbySlider->setEnabled(m_bEnabled); +- m_pStandbySlider->setValue(m_Standby); +- m_pSuspendSlider->setEnabled(m_bEnabled); +- m_pSuspendSlider->setValue(m_Suspend); +- m_pOffSlider->setEnabled(m_bEnabled); +- m_pOffSlider->setValue(m_Off); ++ if (!m_bKPowersave) { ++ m_pStandbySlider->setEnabled(m_bEnabled); ++ m_pStandbySlider->setValue(m_Standby); ++ m_pSuspendSlider->setEnabled(m_bEnabled); ++ m_pSuspendSlider->setValue(m_Suspend); ++ m_pOffSlider->setEnabled(m_bEnabled); ++ m_pOffSlider->setValue(m_Off); ++ } + + m_bMaintainSanity = true; + } diff --git a/opensuse/core/tdebase/kcontrol.diff b/opensuse/core/tdebase/kcontrol.diff new file mode 100644 index 000000000..ab23e34ba --- /dev/null +++ b/opensuse/core/tdebase/kcontrol.diff @@ -0,0 +1,11 @@ +Index: kcontrol/kcontrol/KControl.desktop +=================================================================== +--- kcontrol/kcontrol/KControl.desktop.orig ++++ kcontrol/kcontrol/KControl.desktop +@@ -1,4 +1,6 @@ + [Desktop Entry] ++Categories=Qt;KDE;X-SuSE-core ++OnlyShowIn=KDE; + Exec=kcontrol -caption "%c" %i %m + Icon=kcontrol + Type=Application diff --git a/opensuse/core/tdebase/kde3-session-restore.diff b/opensuse/core/tdebase/kde3-session-restore.diff new file mode 100644 index 000000000..6ade7063b --- /dev/null +++ b/opensuse/core/tdebase/kde3-session-restore.diff @@ -0,0 +1,12 @@ +Index: kde3 +=================================================================== +--- kde3.orig ++++ kde3 +@@ -6,4 +6,7 @@ + # and make sure this script is in $PATH (e.g. make a symlink if necessary). + # + ++PATH=/opt/kde3/bin:${PATH/:\/opt\/kde3\/bin} ++export PATH ++ + exec "$@" diff --git a/opensuse/core/tdebase/kde3-session.diff b/opensuse/core/tdebase/kde3-session.diff new file mode 100644 index 000000000..763879088 --- /dev/null +++ b/opensuse/core/tdebase/kde3-session.diff @@ -0,0 +1,13 @@ +Index: kdm/kfrontend/sessions/kde.desktop.in +=================================================================== +--- kdm/kfrontend/sessions/kde.desktop.in.orig ++++ kdm/kfrontend/sessions/kde.desktop.in +@@ -3,7 +3,7 @@ Encoding=UTF-8 + Type=XSession + Exec=@KDE_BINDIR@/startkde + TryExec=@KDE_BINDIR@/startkde +-Name=KDE ++Name=KDE3 + Name[hi]=केडीई + Name[mn]=КДР+ Name[ta]=Kà®à®±à¯à®±à®•à¯ காவலன௠diff --git a/opensuse/core/tdebase/kdebase_khc_rellinks.diff b/opensuse/core/tdebase/kdebase_khc_rellinks.diff new file mode 100644 index 000000000..e11269095 --- /dev/null +++ b/opensuse/core/tdebase/kdebase_khc_rellinks.diff @@ -0,0 +1,606 @@ +Index: khelpcenter/khelpcenterui.rc +=================================================================== +--- khelpcenter/khelpcenterui.rc.orig ++++ khelpcenter/khelpcenterui.rc +@@ -1,5 +1,5 @@ + <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +-<kpartgui name="khelpcenter" version="14"> ++<kpartgui name="khelpcenter" version="15"> + <MenuBar> + <Menu name="file" noMerge="1"> + <text>&File</text> +@@ -23,8 +23,8 @@ + </Menu> + <Menu name="go_web"> + <text>&Go</text> +- <Action name="prevPage" /> +- <Action name="nextPage" /> ++ <Action name="rellinks_previous" /> ++ <Action name="rellinks_next" /> + <Separator /> + <Action name="back" /> + <Action name="forward" /> +@@ -41,13 +41,19 @@ + <Action name="go_home" /> + <Action name="back" /> + <Action name="forward" /> +- <Separator /> ++ <Separator /> + <Action name="printFrame" /> + <Separator /> + <Action name="copy_text" /> + <Action name="find" /> +- <Separator /> + <Action name="incFontSizes" /> + <Action name="decFontSizes" /> ++ <Separator /> ++ <Action name="rellinks_top" /> ++ <Action name="rellinks_up" /> ++ <Action name="rellinks_first" /> ++ <Action name="rellinks_previous" /> ++ <Action name="rellinks_next" /> ++ <Action name="rellinks_last" /> + </ToolBar> + </kpartgui> +Index: khelpcenter/mainwindow.cpp +=================================================================== +--- khelpcenter/mainwindow.cpp.orig ++++ khelpcenter/mainwindow.cpp +@@ -41,6 +41,7 @@ + #include <kstatusbar.h> + #include <kstdaccel.h> + #include <kdialogbase.h> ++#include <kpopupmenu.h> + + #include <qsplitter.h> + #include <qtextedit.h> +@@ -106,6 +107,8 @@ MainWindow::MainWindow() + + connect( mDoc, SIGNAL( selectionChanged() ), + SLOT( enableCopyTextAction() ) ); ++ connect( mDoc, SIGNAL( completed() ), ++ SLOT( updateLinkActions() ) ); + + statusBar()->insertItem(i18n("Preparing Index"), 0, 1); + statusBar()->setItemAlignment(0, AlignLeft | AlignVCenter); +@@ -250,6 +253,8 @@ void MainWindow::setupActions() + new KAction( i18n( "Configure Fonts..." ), KShortcut(), this, SLOT( slotConfigureFonts() ), actionCollection(), "configure_fonts" ); + new KAction( i18n( "Increase Font Sizes" ), "viewmag+", KShortcut(), this, SLOT( slotIncFontSizes() ), actionCollection(), "incFontSizes" ); + new KAction( i18n( "Decrease Font Sizes" ), "viewmag-", KShortcut(), this, SLOT( slotDecFontSizes() ), actionCollection(), "decFontSizes" ); ++ ++ initActions(); + } + + void MainWindow::slotCopySelectedText() +@@ -462,6 +467,418 @@ void MainWindow::slotConfigureFonts() + mDoc->slotReload(); + } + ++void MainWindow::initActions() ++{ ++ kdDebug() << k_funcinfo << endl; ++ ++ // ------------- Navigation links -------------- ++ kaction_map["home"] = new KAction( i18n("&Top"), "2uparrow", KShortcut("Ctrl+Alt+T"), this, SLOT(goHome()), actionCollection(), "rellinks_top" ); ++ kaction_map["home"]->setWhatsThis( i18n("<p>This link references a home page or the top of some hierarchy.</p>") ); ++ ++ kaction_map["up"] = new KAction( i18n("&Up"), "1uparrow", KShortcut("Ctrl+Alt+U"), this, SLOT(goUp()), actionCollection(), "rellinks_up" ); ++ kaction_map["up"]->setWhatsThis( i18n("<p>This link references the immediate parent of the current document.</p>") ); ++ ++ bool isRTL = QApplication::reverseLayout(); ++ ++ kaction_map["begin"] = new KAction( i18n("&First"), isRTL ? "2rightarrow" : "2leftarrow", KShortcut("Ctrl+Alt+F"), this, SLOT(goFirst()), actionCollection(), "rellinks_first" ); ++ kaction_map["begin"]->setWhatsThis( i18n("<p>This link type tells search engines which document is considered by the author to be the starting point of the collection.</p>") ); ++ ++ kaction_map["prev"] = new KAction( i18n("&Previous"), isRTL ? "1rightarrow" : "1leftarrow", KShortcut("Ctrl+Alt+P"), this, SLOT(goPrevious()), actionCollection(), "rellinks_previous" ); ++ kaction_map["prev"]->setWhatsThis( i18n("<p>This link references the previous document in an ordered series of documents.</p>") ); ++ ++ kaction_map["next"] = new KAction( i18n("&Next"), isRTL ? "1leftarrow" : "1rightarrow", KShortcut("Ctrl+Alt+N"), this, SLOT(goNext()), actionCollection(), "rellinks_next" ); ++ kaction_map["next"]->setWhatsThis( i18n("<p>This link references the next document in an ordered series of documents.</p>") ); ++ ++ kaction_map["last"] = new KAction( i18n("&Last"), isRTL ? "2leftarrow" : "2rightarrow", KShortcut("Ctrl+Alt+L"), this, SLOT(goLast()), actionCollection(), "rellinks_last" ); ++ kaction_map["last"]->setWhatsThis( i18n("<p>This link references the end of a sequence of documents.</p>") ); ++ ++ // ------------ special items -------------------------- ++ kaction_map["search"] = new KAction( i18n("&Search"), "filefind", KShortcut("Ctrl+Alt+S"), this, SLOT(goSearch()), actionCollection(), "rellinks_search" ); ++ kaction_map["search"]->setWhatsThis( i18n("<p>This link references the search.</p>") ); ++ ++ // ------------ Document structure links --------------- ++ m_document = new KActionMenu( i18n("Document"), "contents", actionCollection(), "rellinks_document" ); ++ m_document->setWhatsThis( i18n("<p>This menu contains the links referring the document information.</p>") ); ++ m_document->setDelayed(false); ++ ++ kaction_map["contents"] = new KAction( i18n("Table of &Contents"), "contents", KShortcut("Ctrl+Alt+C"), this, SLOT(goContents()), actionCollection(), "rellinks_toc" ); ++ m_document->insert(kaction_map["contents"]); ++ kaction_map["contents"]->setWhatsThis( i18n("<p>This link references the table of contents.</p>") ); ++ ++ kactionmenu_map["chapter"] = new KActionMenu( i18n("Chapters"), "fileopen", actionCollection(), "rellinks_chapters" ); ++ m_document->insert(kactionmenu_map["chapter"]); ++ connect( kactionmenu_map["chapter"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT(goChapter(int))); ++ kactionmenu_map["chapter"]->setWhatsThis( i18n("<p>This menu references the chapters of the document.</p>") ); ++ kactionmenu_map["chapter"]->setDelayed(false); ++ ++ kactionmenu_map["section"] = new KActionMenu( i18n("Sections"), "fileopen", actionCollection(), "rellinks_sections" ); ++ m_document->insert(kactionmenu_map["section"]); ++ connect( kactionmenu_map["section"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goSection( int ) ) ); ++ kactionmenu_map["section"]->setWhatsThis( i18n("<p>This menu references the sections of the document.</p>") ); ++ kactionmenu_map["section"]->setDelayed(false); ++ ++ kactionmenu_map["subsection"] = new KActionMenu( i18n("Subsections"), "fileopen", actionCollection(), "rellinks_subsections" ); ++ m_document->insert(kactionmenu_map["subsection"]); ++ connect( kactionmenu_map["subsection"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goSubsection( int ) ) ); ++ kactionmenu_map["subsection"]->setWhatsThis( i18n("<p>This menu references the subsections of the document.</p>") ); ++ kactionmenu_map["subsection"]->setDelayed(false); ++ ++ kactionmenu_map["appendix"] = new KActionMenu( i18n("Appendix"), "edit", actionCollection(), "rellinks_appendix" ); ++ m_document->insert(kactionmenu_map["appendix"]); ++ connect( kactionmenu_map["appendix"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAppendix( int ) ) ); ++ kactionmenu_map["appendix"]->setWhatsThis( i18n("<p>This link references the appendix.</p>") ); ++ kactionmenu_map["appendix"]->setDelayed(false); ++ ++ kaction_map["glossary"] = new KAction( i18n("&Glossary"), "flag", KShortcut("Ctrl+Alt+G"), this, SLOT(goGlossary()), actionCollection(), "rellinks_glossary" ); ++ m_document->insert(kaction_map["glossary"]); ++ kaction_map["glossary"]->setWhatsThis( i18n("<p>This link references the glossary.</p>") ); ++ ++ kaction_map["index"] = new KAction( i18n("&Index"), "info", KShortcut("Ctrl+Alt+I"), this, SLOT(goIndex()), actionCollection(), "rellinks_index" ); ++ m_document->insert(kaction_map["index"]); ++ kaction_map["index"]->setWhatsThis( i18n("<p>This link references the index.</p>") ); ++ ++ // Other links ++ m_more = new KActionMenu( i18n("More"), "misc", actionCollection(), "rellinks_more" ); ++ m_more->setWhatsThis( i18n("<p>This menu contains other important links.</p>") ); ++ m_more->setDelayed(false); ++ ++ kaction_map["help"] = new KAction( i18n("&Help"), "help", KShortcut("Ctrl+Alt+H"), this, SLOT(goHelp()), actionCollection(), "rellinks_help" ); ++ m_more->insert(kaction_map["help"]); ++ kaction_map["help"]->setWhatsThis( i18n("<p>This link references the help.</p>") ); ++ ++ kaction_map["author"] = new KAction( i18n("&Authors"), "mail_new", KShortcut("Ctrl+Alt+A"), this, SLOT(goAuthor()), actionCollection(), "rellinks_authors" ); ++ m_more->insert(kaction_map["author"]); ++ kaction_map["author"]->setWhatsThis( i18n("<p>This link references the author.</p>") ); ++ ++ kaction_map["copyright"] = new KAction( i18n("Copy&right"), "signature", KShortcut("Ctrl+Alt+R"), this, SLOT(goCopyright()), actionCollection(), "rellinks_copyright" ); ++ m_more->insert(kaction_map["copyright"]); ++ kaction_map["copyright"]->setWhatsThis( i18n("<p>This link references the copyright.</p>") ); ++ ++ kactionmenu_map["bookmark"] = new KActionMenu( i18n("Bookmarks"), "bookmark_folder", actionCollection(), "rellinks_bookmarks" ); ++ m_more->insert(kactionmenu_map["bookmark"]); ++ kactionmenu_map["bookmark"]->setWhatsThis( i18n("<p>This menu references the bookmarks.</p>") ); ++ connect( kactionmenu_map["bookmark"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goBookmark( int ) ) ); ++ kactionmenu_map["bookmark"]->setDelayed(false); ++ ++ kactionmenu_map["alternate"] = new KActionMenu( i18n("Other Versions"), "attach", actionCollection(), "rellinks_other_versions" ); ++ m_more->insert(kactionmenu_map["alternate"]); ++ kactionmenu_map["alternate"]->setWhatsThis( i18n("<p>This link references the alternate versions of this document.</p>") ); ++ connect( kactionmenu_map["alternate"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAlternate( int ) ) ); ++ kactionmenu_map["alternate"]->setDelayed(false); ++ ++ // Unclassified menu ++ m_links = new KActionMenu( i18n("Miscellaneous"), "rellinks", actionCollection(), "rellinks_links" ); ++ kactionmenu_map["unclassified"] = m_links; ++ kactionmenu_map["unclassified"]->setWhatsThis( i18n("<p>Miscellaneous links.</p>") ); ++ connect( kactionmenu_map["unclassified"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAllElements( int ) ) ); ++ kactionmenu_map["unclassified"]->setDelayed(false); ++ ++ // We unactivate all the possible actions ++ disableAll(); ++} ++ ++/* Code from plugin_rellinks ++ * Copyright (C) 2002, Anders Lund <anders@alweb.dk> * ++ * Copyright (C) 2003, 2004, Franck Qu�ain <shift@free.fr> * ++ * Copyright (C) 2004, Kevin Krammer <kevin.krammer@gmx.at> * ++ * Copyright (C) 2004, 2005, Oliviet Goffart <ogoffart @ kde.org> ++*/ ++void MainWindow::updateLinkActions() ++{ ++ // We disable all ++ disableAll(); ++ ++ // get a list of LINK nodes in document ++ DOM::NodeList linkNodes = mDoc->document().getElementsByTagName( "link" ); ++ ++ kdDebug() << "HELP Rellinks: Link nodes =" << linkNodes.length() << endl; ++ ++ unsigned long nodeLength = linkNodes.length(); ++ ++ for ( unsigned int i=0; i < nodeLength; i++ ) { ++ // create a entry for each one ++ DOM::Element e( linkNodes.item( i ) ); ++ ++ ++ // --- Retrieve of the relation type -- ++ ++ QString rel = e.getAttribute( "rel" ).string(); ++ rel = rel.simplifyWhiteSpace(); ++ if (rel.isEmpty()) { ++ // If the "rel" attribut is null then use the "rev" attribute... ++ QString rev = e.getAttribute( "rev" ).string(); ++ rev = rev.simplifyWhiteSpace(); ++ if (rev.isEmpty()) { ++ // if "rev" attribut is also empty => ignore ++ continue; ++ } ++ // Determine the "rel" equivalent of "rev" type ++ rel = transformRevToRel(rev); ++ } ++ // Determin the name used internally ++ QString lrel = getLinkType(rel.lower()); ++ // relation to ignore ++ if (lrel.isEmpty()) continue; ++ kdDebug() << "lrel=" << lrel << endl; ++ ++ // -- Retrieve of other usefull informations -- ++ ++ QString href = e.getAttribute( "href" ).string(); ++ // if nowhere to go, ignore the link ++ if (href.isEmpty()) continue; ++ QString title = e.getAttribute( "title" ).string(); ++ QString hreflang = e.getAttribute( "hreflang" ).string(); ++ ++ KURL ref( mDoc->url(), href ); ++ if ( title.isEmpty() ) ++ title = ref.prettyURL(); ++ ++ // escape ampersand before settings as action title, otherwise the menu entry will interpret it as an ++ // accelerator ++ title.replace('&', "&&"); ++ ++ // -- Menus activation -- ++ ++ // Activation of "Document" menu ? ++ if (lrel == "contents" || lrel == "glossary" || lrel == "index" || lrel == "appendix") { ++ m_document->setEnabled(true); ++ } ++ // Activation of "More" menu ? ++ if (lrel == "help" || lrel == "author" || lrel == "copyright" ) { ++ m_more->setEnabled(true); ++ } ++ ++ // -- Buttons or menu items activation / creation -- ++ if (lrel == "bookmark" || lrel == "alternate") { ++ int id = kactionmenu_map[lrel]->popupMenu()->insertItem( title ); ++ m_more->setEnabled(true); ++ kactionmenu_map[lrel]->setEnabled(true); ++ element_map[lrel][id] = e; ++ ++ } else if (lrel == "appendix" || lrel == "chapter" || lrel == "section" || lrel == "subsection") { ++ int id = kactionmenu_map[lrel]->popupMenu()->insertItem( title ); ++ m_document->setEnabled(true); ++ kactionmenu_map[lrel]->setEnabled(true); ++ element_map[lrel][id] = e; ++ ++ } else { ++ // It is a unique action ++ element_map[lrel][0] = e; ++ if (kaction_map[lrel]) { ++ kaction_map[lrel]->setEnabled(true); ++ // Tooltip ++ if (hreflang.isEmpty()) { ++ kaction_map[lrel]->setToolTip( title ); ++ } else { ++ kaction_map[lrel]->setToolTip( title + " [" + hreflang + "]"); ++ } ++ } else { ++ // For the moment all the elements are reference in a separated menu ++ // TODO : reference the unknown ? ++ int id = kactionmenu_map["unclassified"]->popupMenu()->insertItem( lrel + " : " + title ); ++ kactionmenu_map["unclassified"]->setEnabled(true); ++ element_map["unclassified"][id] = e; ++ } ++ ++ } ++ ++ } ++} ++ ++void MainWindow::disableAll() { ++ element_map.clear(); ++ ++ // Clear actions ++ KActionMap::Iterator it; ++ for ( it = kaction_map.begin(); it != kaction_map.end(); ++it ) { ++ // If I don't test it crash :( ++ if (it.data()) { ++ it.data()->setEnabled(false); ++ it.data()->setToolTip(it.data()->text().remove('&')); ++ } ++ } ++ ++ // Clear actions ++ KActionMenuMap::Iterator itmenu; ++ for ( itmenu = kactionmenu_map.begin(); itmenu != kactionmenu_map.end(); ++itmenu ) { ++ // If I don't test it crash :( ++ if (itmenu.data()) { ++ itmenu.data()->popupMenu()->clear(); ++ itmenu.data()->setEnabled(false); ++ itmenu.data()->setToolTip(itmenu.data()->text().remove('&')); ++ } ++ } ++ ++ // Unactivate menus ++ m_more->setEnabled(false); ++ m_document->setEnabled(false); ++ ++} ++ ++QString MainWindow::getLinkType(const QString &lrel) { ++ // Relations to ignore... ++ if (lrel.contains("stylesheet") ++ || lrel == "script" ++ || lrel == "icon" ++ || lrel == "shortcut icon" ++ || lrel == "prefetch" ) ++ return QString::null; ++ ++ // ...known relations... ++ if (lrel == "top" || lrel == "origin" || lrel == "start") ++ return "home"; ++ if (lrel == "parent") ++ return "up"; ++ if (lrel == "first") ++ return "begin"; ++ if (lrel == "previous") ++ return "prev"; ++ if (lrel == "child") ++ return "next"; ++ if (lrel == "end") ++ return "last"; ++ if (lrel == "toc") ++ return "contents"; ++ if (lrel == "find") ++ return "search"; ++ if (lrel == "alternative stylesheet") ++ return "alternate stylesheet"; ++ if (lrel == "authors") ++ return "author"; ++ if (lrel == "toc") ++ return "contents"; ++ ++ //...unknown relations or name that don't need to change ++ return lrel; ++} ++ ++QString MainWindow::transformRevToRel(const QString &rev) { ++ QString altRev = getLinkType(rev); ++ ++ // Known relations ++ if (altRev == "prev") ++ return getLinkType("next"); ++ if (altRev == "next") ++ return getLinkType("prev"); ++ if (altRev == "made") ++ return getLinkType("author"); ++ if (altRev == "up") ++ return getLinkType("child"); ++ if (altRev == "sibling") ++ return getLinkType("sibling"); ++ ++ //...unknown inverse relation => ignore for the moment ++ return QString::null; ++} ++ ++void MainWindow::goHome() { ++ goToLink("home"); ++} ++ ++void MainWindow::goUp() { ++ goToLink("up"); ++} ++ ++void MainWindow::goFirst() { ++ goToLink("begin"); ++} ++ ++void MainWindow::goPrevious() { ++ goToLink("prev"); ++} ++ ++void MainWindow::goNext() { ++ goToLink("next"); ++} ++ ++void MainWindow::goLast() { ++ goToLink("last"); ++} ++ ++void MainWindow::goContents() { ++ goToLink("contents"); ++} ++ ++void MainWindow::goIndex() { ++ goToLink("index"); ++} ++ ++void MainWindow::goGlossary() { ++ goToLink("glossary"); ++} ++ ++void MainWindow::goHelp() { ++ goToLink("help"); ++} ++ ++void MainWindow::goSearch() { ++ goToLink("search"); ++} ++ ++void MainWindow::goAuthor() { ++ goToLink("author"); ++} ++ ++ ++void MainWindow::goCopyright() { ++ goToLink("copyright"); ++} ++ ++void MainWindow::goBookmark(int id) { ++ goToLink("bookmark", id); ++} ++ ++void MainWindow::goChapter(int id) { ++ goToLink("chapter", id); ++} ++ ++void MainWindow::goSection(int id) { ++ goToLink("section", id); ++} ++ ++void MainWindow::goSubsection(int id) { ++ goToLink("subsection", id); ++} ++ ++void MainWindow::goAppendix(int id) { ++ goToLink("appendix", id); ++} ++ ++void MainWindow::goAlternate(int id) { ++ goToLink("alternate", id); ++} ++ ++void MainWindow::goAllElements(int id) { ++ goToLink("unclassified", id); ++} ++ ++/** Menu links */ ++void MainWindow::goToLink(const QString & rel, int id) { ++ // have the KHTML part open it ++ if (!mDoc) ++ return; ++ ++ DOM::Element e = element_map[rel][id]; ++ QString href = e.getAttribute("href").string(); ++ KURL url( mDoc->url(), href ); ++ QString target = e.getAttribute("target").string(); ++ ++ // URL arguments ++ KParts::URLArgs args; ++ args.frameName = target; ++ ++ // Add base url if not valid ++ if (url.isValid()) { ++ mDoc->browserExtension()->openURLRequest(url, args); ++ } else { ++ KURL baseURL = mDoc->baseURL(); ++ QString endURL = url.prettyURL(); ++ KURL realURL = KURL(baseURL, endURL); ++ mDoc->browserExtension()->openURLRequest(realURL, args); ++ } ++ ++} ++ + #include "mainwindow.moc" + + // vim:ts=2:sw=2:et +Index: khelpcenter/mainwindow.h +=================================================================== +--- khelpcenter/mainwindow.h.orig ++++ khelpcenter/mainwindow.h +@@ -13,6 +13,15 @@ + #include "navigator.h" + #include "glossary.h" + ++#include <dom/dom_element.h> ++ ++class KAction; ++class KActionMenu; ++// type definitions ++typedef QMap<int,DOM::Element> DOMElementMap; ++typedef QMap<QString, KAction*> KActionMap; ++typedef QMap<QString, KActionMenu*> KActionMenuMap; ++ + class KHTMLPart; + class QSplitter; + +@@ -68,11 +77,43 @@ class MainWindow : public KMainWindow, p + void writeConfig(); + + protected slots: ++ void updateLinkActions(); + void enableLastSearchAction(); + void enableCopyTextAction(); + + private: + void stop(); ++ /** ++ * initialise all KActions ++ */ ++ void initActions(); ++ /** ++ * Function used to disable all the item of the toolbar (c) rellinks ++ */ ++ void disableAll(); ++ /** ++ * Function used to get link type of a relation. ++ * For example "prev" is of type "previous" and "toc" is of type "contents" ++ * If the relation must be ignored return NULL. ++ * If the relation is unknow return the input relation type. ++ * @param lrel Previous relation name ++ * @return New relation name ++ */ ++ QString getLinkType(const QString &lrel); ++ /** ++ * Function used to return the "rel" equivalent of "rev" link type ++ * If the equivalent is not found return NULL ++ * @param rev Inverse relation name ++ * @return Equivalent relation name ++ */ ++ QString transformRevToRel(const QString &rev) ; ++ ++ /** ++ * Go to the link (c) rellinks ++ * @param rel Relation name ++ * @param id Identifier of the menu item ++ */ ++ void goToLink(const QString & rel, int id=0); + + private slots: + void slotGlossSelected(const GlossaryEntry &entry); +@@ -90,7 +131,29 @@ class MainWindow : public KMainWindow, p + void slotConfigureFonts(); + void slotCopySelectedText(); + +-private: ++ void goHome(); ++ void goUp(); ++ void goFirst(); ++ void goPrevious(); ++ void goNext(); ++ void goLast(); ++ void goContents(); ++ void goIndex(); ++ void goGlossary(); ++ void goHelp(); ++ void goSearch(); ++ void goCopyright(); ++ void goAuthor(); ++ ++ void goBookmark(int id); ++ void goChapter(int id); ++ void goSection(int id); ++ void goSubsection(int id); ++ void goAppendix(int id); ++ void goAlternate(int id); ++ void goAllElements(int id); ++ ++ private: + void updateZoomActions(); + + QSplitter *mSplitter; +@@ -100,6 +163,17 @@ private: + KAction *mLastSearchAction; + KAction *mCopyText; + LogDialog *mLogDialog; ++ //(c) rellinks ++ /** Map of KAction */ ++ KActionMap kaction_map; ++ /** Map of KActionMenu */ ++ KActionMenuMap kactionmenu_map; ++ /** Map of all the link element which can be managed by rellinks */ ++ QMap<QString,DOMElementMap> element_map; ++ KActionMenu *m_document; ++ KActionMenu *m_more; ++ KActionMenu *m_links; ++ + }; + + } diff --git a/opensuse/core/tdebase/kdebase_networkstatus_branch.diff b/opensuse/core/tdebase/kdebase_networkstatus_branch.diff new file mode 100644 index 000000000..8329d3cd2 --- /dev/null +++ b/opensuse/core/tdebase/kdebase_networkstatus_branch.diff @@ -0,0 +1,36 @@ +Index: konqueror/konq_frame.cc +=================================================================== +--- konqueror/konq_frame.cc.orig ++++ konqueror/konq_frame.cc +@@ -34,6 +34,7 @@ + #include <kprogress.h> + #include <klocale.h> + #include <ksqueezedtextlabel.h> ++#include <networkstatusindicator.h> + + #include "konq_events.h" + #include "konq_frame.h" +@@ -97,6 +98,10 @@ KonqFrameStatusBar::KonqFrameStatusBar( + m_progressBar->hide(); + addWidget( m_progressBar, 0, true /*permanent->right align*/ ); + ++ StatusBarNetworkStatusIndicator * indicator = new StatusBarNetworkStatusIndicator( this, "networkstatusindicator" ); ++ addWidget( indicator, 0, false ); ++ indicator->init(); ++ + fontChange(QFont()); + installEventFilter( this ); + } +Index: konqueror/Makefile.am +=================================================================== +--- konqueror/Makefile.am.orig ++++ konqueror/Makefile.am +@@ -48,7 +48,7 @@ noinst_HEADERS = KonqMainWindowIface.h K + konq_misc.h konq_openurlrequest.h konq_profiledlg.h konq_run.h \ + konq_view.h konq_viewmgr.h konq_extensionmanager.h version.h + +-konqueror_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) ++konqueror_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -lconnectionmanager + konqueror_la_LIBADD = ../libkonq/libkonq.la libkonqueror_intern.la $(LIBMALLOC) $(LIB_KUTILS) + + # Hmm, this experiment of a static konq failed, don't trust it... diff --git a/opensuse/core/tdebase/kdeeject.diff b/opensuse/core/tdebase/kdeeject.diff new file mode 100644 index 000000000..d22e67fb6 --- /dev/null +++ b/opensuse/core/tdebase/kdeeject.diff @@ -0,0 +1,58 @@ +Index: kdeeject/kdeeject +=================================================================== +--- kdeeject/kdeeject.orig ++++ kdeeject/kdeeject +@@ -4,12 +4,38 @@ + # + # Copyright GPL v2 by David Faure <david@mandrakesoft.com> + # +-if test $# -ge 1 -a "$1" != "--help"; then +- quiet=0 +- if test "$1" = "-q"; then +- quiet=1 +- shift +- fi ++quiet=0 ++if test "$1" = "-q"; then ++ quiet=1 ++ shift ++fi ++ ++if test "$1" = "--help"; then ++ echo "Usage: $0 <name> where name is a device or a mountpoint." ++ exit 0 ++fi ++ ++if test -z "$1"; then ++ for dev in /dev/cdrom /dev/dvd /dev/dvdram /dev/cdrecorder; do ++ if test -e $dev; then ++ lp=`readlink $dev` ++ if test -n "$lp"; then ++ device=/dev/$lp ++ else ++ device=$dev ++ fi ++ break ++ fi ++ done ++else ++ device=$1 ++fi ++ ++udi=`dcop kded mediamanager properties $device 2>/dev/null | head -n 1 ` ++if test -n "$udi"; then ++ dcop kded mediamanager unmount "$udi" >/dev/null 2>&1 ++fi ++ + # Checking for stuff in the PATH is ugly with sh. + # I guess this is the reason for making this a kde app... + OS=`uname -s` +@@ -34,7 +60,5 @@ if test $# -ge 1 -a "$1" != "--help"; th + elif test $quiet -eq 0; then + kdialog --title "KDE Eject" --error "Eject $1 failed!" + fi +-else +- kdialog --title "KDE Eject" --msgbox "Usage: $0 <name> where name is a device or a mountpoint." +-fi ++ + exit 1 diff --git a/opensuse/core/tdebase/kdesktop_icons.diff b/opensuse/core/tdebase/kdesktop_icons.diff new file mode 100644 index 000000000..5d208b0dd --- /dev/null +++ b/opensuse/core/tdebase/kdesktop_icons.diff @@ -0,0 +1,311 @@ +Index: kdesktop/KDesktopIface.h +=================================================================== +--- kdesktop/KDesktopIface.h.orig ++++ kdesktop/KDesktopIface.h +@@ -107,6 +107,35 @@ k_dcop: + * space for desktop icons + */ + virtual void desktopIconsAreaChanged(const QRect &area, int screen) = 0; ++ ++ /** ++ * Find the next free place for a not yet existing icon, so it fits ++ * in the user arrangement. Basicly prepare for icons to be moved in. ++ * It will try to find a place in the virtual grid near col,row ++ * where no other icon is. ++ * ++ * If you specify -1 for row or column, it will try to find the next ++ * free room where no other icon follows. E.g. if you specify column ++ * = -1 and row = 0, kdesktop will find the next vertical placement ++ * so that the icon appears at the end of the existing icons preferable ++ * in the first column. If the first column is full, it will find the ++ * next free room in the second column. ++ * ++ * If you specify both column and row, kdesktop won't care for aligning, ++ * or surrounding icons, but try to find the free place near the given ++ * grid place (e.g. specify 0,0 to find the nearest place in the left ++ * upper corner). ++ */ ++ virtual QPoint findPlaceForIcon( int column, int row) = 0; ++ ++ /// copy the desktop file in the Desktop and place it at x, y ++ virtual void addIcon(const QString &url, int x, int y) = 0; ++ ++ /// same with specific destination ++ virtual void addIcon(const QString &url, const QString &dest, int x, int y) = 0; ++ ++ /// remove the desktop file (either full path or relative) ++ virtual void removeIcon(const QString &dest) = 0; + }; + + #endif +Index: kdesktop/desktop.cc +=================================================================== +--- kdesktop/desktop.cc.orig ++++ kdesktop/desktop.cc +@@ -32,6 +32,9 @@ + #include <unistd.h> + #include <kcolordrag.h> + #include <kurldrag.h> ++#include <stdlib.h> ++#include <kio/job.h> ++#include <qfile.h> + + #include <qdir.h> + #include <qevent.h> +@@ -58,6 +61,7 @@ + #include <kglobalsettings.h> + #include <kpopupmenu.h> + #include <kapplication.h> ++#include <kdirlister.h> + // Create the equivalent of KAccelBase::connectItem + // and then remove this include and fix reconnects in initRoot() -- ellis + //#include <kaccelbase.h> +@@ -983,4 +987,47 @@ bool KDesktop::event(QEvent * e) + return QWidget::event(e); + } + ++QPoint KDesktop::findPlaceForIcon( int column, int row ) ++{ ++ if (m_pIconView) ++ return m_pIconView->findPlaceForIcon(column, row); ++ else ++ return QPoint(-1, -1); ++} ++ ++void KDesktop::addIcon(const QString & _url, int x, int y) ++{ ++ addIcon( _url, KGlobalSettings::desktopPath(), x, y ); ++} ++ ++void KDesktop::addIcon(const QString & _url, const QString & _dest, int x, int y) ++{ ++ QString filename = _url.mid(_url.findRev('/') + 1); ++ ++ QValueList<KIO::CopyInfo> files; ++ KIO::CopyInfo i; ++ i.uSource = KURL::fromPathOrURL( _url ); ++ i.uDest = KURL::fromPathOrURL( _dest ); ++ i.uDest.addPath( filename ); ++ files.append(i); ++ if (!QFile::exists(i.uDest.prettyURL().replace("file://",QString::null))) { m_pIconView->slotAboutToCreate( QPoint( x, y ), files ); ++ KIO::copy( i.uSource, i.uDest, false ); } ++ ++// m_pIconView->addFuturePosition(filename, x, y); ++ // qDebug("addIcon %s %s %d %d", _url.latin1(), _dest.latin1(), x, y); ++// system(QString("cp \"%1\" \"%2/%3\"").arg(KURL(_url).path()).arg(KURL(_dest).path()).arg(filename).latin1()); ++// m_pIconView->update( _dest ); ++} ++ ++void KDesktop::removeIcon(const QString &_url) ++{ ++ if (_url.at(0) != '/') { ++ qDebug("removeIcon with relative path not supported for now"); ++ return; ++ } ++ unlink(KURL(_url).path().latin1()); ++ QString dest = _url.left(_url.findRev('/') + 1); ++ m_pIconView->update( dest ); ++} ++ + #include "desktop.moc" +Index: kdesktop/desktop.h +=================================================================== +--- kdesktop/desktop.h.orig ++++ kdesktop/desktop.h +@@ -164,6 +164,11 @@ protected: + virtual void setIconsEnabled( bool enable ); + virtual bool event ( QEvent * e ); + ++ virtual QPoint findPlaceForIcon( int column, int row); ++ virtual void addIcon(const QString &url, int x, int y); ++ virtual void addIcon(const QString &url, const QString &dest, int x, int y); ++ virtual void removeIcon(const QString &url); ++ + private slots: + void desktopResized(); + +Index: kdesktop/kdiconview.cc +=================================================================== +--- kdesktop/kdiconview.cc.orig ++++ kdesktop/kdiconview.cc +@@ -962,6 +962,18 @@ void KDIconView::slotNewItems( const KFi + kdDebug(1214) << "KDIconView::slotNewItems count=" << entries.count() << endl; + KFileItemListIterator it(entries); + KFileIVI* fileIVI = 0L; ++ ++ if (m_nextItemPos.isNull() && !m_dotDirectory) { ++ // Not found, we'll need to save the new pos ++ kdDebug(1214)<<"Neither a drop position stored nor m_dotDirectory set"<<endl; ++ m_dotDirectory = new KSimpleConfig( dotDirectoryPath(), true ); ++ // recursion ++ slotNewItems( entries ); ++ delete m_dotDirectory; ++ m_dotDirectory = 0; ++ return; ++ } ++ + for (; it.current(); ++it) + { + KURL url = it.current()->url(); +@@ -1026,15 +1038,6 @@ void KDIconView::slotNewItems( const KFi + kdDebug(1214)<<"Using saved position"<<endl; + } + } +- else +- { +- // Not found, we'll need to save the new pos +- kdDebug(1214)<<"slotNewItems(): New item without position information, try to find a sane location"<<endl; +- +- moveToFreePosition(fileIVI); +- +- m_bNeedSave = true; +- } + } + } + +@@ -1638,6 +1641,98 @@ void KDIconView::moveToFreePosition(QIco + } + + ++QPoint KDIconView::findPlaceForIconCol( int column, int dx, int dy) ++{ ++ if (column < 0) ++ return QPoint(); ++ ++ QRect rect; ++ rect.moveTopLeft( QPoint(column * dx, 0) ); ++ rect.setWidth(dx); ++ rect.setHeight(dy); ++ ++ if (rect.right() > viewport()->width()) ++ return QPoint(); ++ ++ while ( rect.bottom() < viewport()->height() - spacing() ) ++ { ++ if ( !isFreePosition(0,rect) ) ++ rect.moveBy(0, rect.height()); ++ else ++ return rect.topLeft(); ++ } ++ ++ return QPoint(); ++} ++ ++QPoint KDIconView::findPlaceForIconRow( int row, int dx, int dy ) ++{ ++ if (row < 0) ++ return QPoint(); ++ ++ QRect rect; ++ rect.moveTopLeft(QPoint(0, row * dy)); ++ rect.setWidth(dx); ++ rect.setHeight(dy); ++ ++ if (rect.bottom() > viewport()->height()) ++ return QPoint(); ++ ++ while (rect.right() < viewport()->width() - spacing()) ++ { ++ if (!isFreePosition(0,rect)) ++ rect.moveBy(rect.width()+spacing(), 0); ++ else ++ return rect.topLeft(); ++ } ++ ++ return QPoint(); ++} ++ ++QPoint KDIconView::findPlaceForIcon( int column, int row) ++{ ++ int dx = gridXValue(), dy = 0; ++ QIconViewItem *item = firstItem(); ++ for ( ; item; item = item->nextItem() ) { ++ dx = QMAX( dx, item->width() ); ++ dy = QMAX( dy, item->height() ); ++ } ++ ++ dx += spacing(); ++ dy += spacing(); ++ ++ if (row == -1) { ++ int max_cols = viewport()->width() / dx; ++ int delta = 0; ++ QPoint res; ++ do { ++ delta++; ++ res = findPlaceForIconCol(column + (delta / 2) * (-2 * (delta % 2) + 1), ++ dx, dy); ++ if (delta / 2 > QMAX(max_cols - column, column)) ++ return res; ++ } while (res.isNull()); ++ return res; ++ } ++ ++ if (column == -1) { ++ int max_rows = viewport()->height() / dy; ++ int delta = 0; ++ QPoint res; ++ do { ++ delta++; ++ res = findPlaceForIconRow(row + (delta / 2) * (-2 * (delta % 2) + 1), ++ dx, dy); ++ if (delta / 2 > QMAX(max_rows - row, row)) ++ return res; ++ } while (res.isNull()); ++ return res; ++ } ++ ++ // very unlikely - if I may add that ++ return QPoint(0, 0); ++} ++ + void KDIconView::saveIconPositions() + { + kdDebug(1214) << "KDIconView::saveIconPositions" << endl; +@@ -1665,4 +1760,11 @@ void KDIconView::saveIconPositions() + m_dotDirectory->sync(); + } + ++void KDIconView::update( const QString &_url ) ++{ ++ if (m_dirLister) ++ m_dirLister->updateDirectory( _url ); ++} ++ ++ + #include "kdiconview.moc" +Index: kdesktop/kdiconview.h +=================================================================== +--- kdesktop/kdiconview.h.orig ++++ kdesktop/kdiconview.h +@@ -73,6 +73,8 @@ public: + + QStringList selectedURLs(); + ++ void update( const QString &url ); ++ + /** + * Save the icon positions + */ +@@ -103,6 +105,10 @@ public: + + void startDirLister(); + ++ QPoint findPlaceForIconCol( int column, int dx, int dy ); ++ QPoint findPlaceForIconRow( int row, int dx, int dy ); ++ QPoint findPlaceForIcon( int column, int row ); ++ + protected slots: + + // slots connected to the icon view +@@ -112,8 +118,9 @@ protected slots: + void slotMouseButtonClickedKDesktop(int _button, QIconViewItem* _item, const QPoint& _global); + void slotContextMenuRequested(QIconViewItem* _item, const QPoint& _global); + void slotEnableAction( const char * name, bool enabled ); ++public slots: + void slotAboutToCreate(const QPoint &pos, const QValueList<KIO::CopyInfo> &files); +- ++protected slots: + void slotItemRenamed(QIconViewItem*, const QString &name); + + // slots connected to the directory lister diff --git a/opensuse/core/tdebase/kdesu-remember-keep-password.diff b/opensuse/core/tdebase/kdesu-remember-keep-password.diff new file mode 100644 index 000000000..29e9002d8 --- /dev/null +++ b/opensuse/core/tdebase/kdesu-remember-keep-password.diff @@ -0,0 +1,18 @@ +Subject: Default to kdesu password remembering on, but remember last state +From: Lubos Lunak +Feature: bnc#386531 +Patch-upstream: no +Relates: kdebase4/kdesu-remember-keep-password.diff, kdelibs3/kdesu-settings.diff + +Index: kdesu/kdesu/kdesu.cpp +=================================================================== +--- kdesu/kdesu/kdesu.cpp (revision 810363) ++++ kdesu/kdesu/kdesu.cpp (working copy) +@@ -382,6 +382,7 @@ + change_uid = false; + password = dlg.password(); + keep = dlg.keep(); ++ KConfigGroup(config,"Passwords").writeEntry("Keep", keep); + data.setSilent( KStartupInfoData::No ); + KStartupInfo::sendChange( id, data ); + } diff --git a/opensuse/core/tdebase/kdesud-security.diff b/opensuse/core/tdebase/kdesud-security.diff new file mode 100644 index 000000000..40b44de71 --- /dev/null +++ b/opensuse/core/tdebase/kdesud-security.diff @@ -0,0 +1,21 @@ +Index: kdesu/kdesud/kdesud.cpp +=================================================================== +--- kdesu/kdesud/kdesud.cpp.orig ++++ kdesu/kdesud/kdesud.cpp +@@ -45,6 +45,7 @@ + #include <pwd.h> + #include <errno.h> + ++#include <sys/prctl.h> + #include <sys/time.h> + #include <sys/stat.h> + #include <sys/types.h> +@@ -248,6 +249,8 @@ int create_socket() + + int main(int argc, char *argv[]) + { ++ prctl(PR_SET_DUMPABLE, 0); ++ + KAboutData aboutData("kdesud", I18N_NOOP("KDE su daemon"), + Version, I18N_NOOP("Daemon used by kdesu"), + KAboutData::License_Artistic, diff --git a/opensuse/core/tdebase/kdm-admin-mode.diff b/opensuse/core/tdebase/kdm-admin-mode.diff new file mode 100644 index 000000000..6028d7698 --- /dev/null +++ b/opensuse/core/tdebase/kdm-admin-mode.diff @@ -0,0 +1,424 @@ +Index: kdm/config.def +=================================================================== +--- kdm/config.def.orig ++++ kdm/config.def +@@ -2002,6 +2002,17 @@ Description: + Specify the widget style for the greeter. Empty means to use the + built-in default which currently is <literal>Plastik</literal>. + ++Key: UseAdminSession ++Type: bool ++Default: false ++User: greeter ++Instance: #*/! ++Comment: ++ Admin session ++Description: ++ If given there will be a special button that requires root password ++ and starts the given session ++ + Key: ColorScheme + Type: string + Default: "" +Index: kdm/kfrontend/Makefile.am +=================================================================== +--- kdm/kfrontend/Makefile.am.orig ++++ kdm/kfrontend/Makefile.am +@@ -21,6 +21,7 @@ kdm_greet_SOURCES = \ + kchooser.cpp \ + kgverify.cpp \ + kdmshutdown.cpp \ ++ kdmadmindialog.cpp \ + kgreeter.cpp \ + kgapp.cpp + kdm_greet_LDFLAGS = $(all_libraries) $(KDE_RPATH) +Index: kdm/kfrontend/kdmadmindialog.cpp +=================================================================== +--- /dev/null ++++ kdm/kfrontend/kdmadmindialog.cpp +@@ -0,0 +1,176 @@ ++ /* ++ ++ Admin dialog ++ ++ Copyright (C) 1997, 1998, 2000 Steffen Hansen <hansen@kde.org> ++ Copyright (C) 2000-2003 Oswald Buddenhagen <ossi@kde.org> ++ ++ ++ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ */ ++ ++#include "kdmadmindialog.h" ++#include "kdmconfig.h" ++#include "kgdialog.h" ++#include "kdm_greet.h" ++#include <stdlib.h> ++ ++#include <kapplication.h> ++#include <kseparator.h> ++#include <klocale.h> ++#include <kpushbutton.h> ++#include <kstdguiitem.h> ++ ++#include <qcombobox.h> ++#include <qvbuttongroup.h> ++#include <qstyle.h> ++#include <qlayout.h> ++#include <qaccel.h> ++#include <qpopupmenu.h> ++ ++int KDMAdmin::curPlugin = -1; ++PluginList KDMAdmin::pluginList; ++ ++KDMAdmin::KDMAdmin( const QString &user, QWidget *_parent ) ++ : inherited( _parent ) ++ , verify( 0 ), curUser(user) ++{ ++ QSizePolicy fp( QSizePolicy::Fixed, QSizePolicy::Fixed ); ++ ++ QVBoxLayout *box = new QVBoxLayout( this, 10 ); ++ ++ QHBoxLayout *hlay = new QHBoxLayout( box ); ++ ++ GSendInt( G_ReadDmrc ); ++ GSendStr( "root" ); ++ GRecvInt(); // ignore status code ... ++ ++ if (curPlugin < 0) { ++ curPlugin = 0; ++ pluginList = KGVerify::init( "classic" ); ++ } ++ verify = new KGStdVerify( this, this, ++ this, "root", ++ pluginList, KGreeterPlugin::Authenticate, ++ KGreeterPlugin::Shutdown ); ++ verify->selectPlugin( curPlugin ); ++ box->addLayout( verify->getLayout() ); ++ QAccel *accel = new QAccel( this ); ++ accel->insertItem( ALT+Key_A, 0 ); ++ connect( accel, SIGNAL(activated(int)), SLOT(slotActivatePlugMenu()) ); ++ ++ box->addWidget( new KSeparator( KSeparator::HLine, this ) ); ++ ++ okButton = new KPushButton( KStdGuiItem::ok(), this ); ++ okButton->setSizePolicy( fp ); ++ okButton->setDefault( true ); ++ cancelButton = new KPushButton( KStdGuiItem::cancel(), this ); ++ cancelButton->setSizePolicy( fp ); ++ ++ hlay = new QHBoxLayout( box ); ++ hlay->addStretch( 1 ); ++ hlay->addWidget( okButton ); ++ hlay->addStretch( 1 ); ++ hlay->addWidget( cancelButton ); ++ hlay->addStretch( 1 ); ++ ++ connect( okButton, SIGNAL(clicked()), SLOT(accept()) ); ++ connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) ); ++ ++ slotWhenChanged(); ++} ++ ++KDMAdmin::~KDMAdmin() ++{ ++ hide(); ++ delete verify; ++} ++ ++void ++KDMAdmin::slotActivatePlugMenu() ++{ ++ QPopupMenu *cmnu = verify->getPlugMenu(); ++ QSize sh( cmnu->sizeHint() / 2 ); ++ cmnu->exec( geometry().center() - QPoint( sh.width(), sh.height() ) ); ++} ++ ++void ++KDMAdmin::accept() ++{ ++ verify->accept(); ++} ++ ++void ++KDMAdmin::slotWhenChanged() ++{ ++ verify->abort(); ++ verify->setEnabled( 1 ); ++ verify->start(); ++} ++ ++void ++KDMAdmin::bye_bye() ++{ ++ GSendInt( G_GetDmrc ); ++ GSendStr( "Session" ); ++ char *sess = GRecvStr(); ++ if (sess && strcmp(sess, "admin")) { ++ GSendInt( G_PutDmrc ); ++ GSendStr( "OrigSession"); ++ GSendStr( sess); ++ free(sess); ++ } ++ ++ GSendInt( G_PutDmrc ); ++ GSendStr( "Session" ); ++ GSendStr( "admin" ); ++ inherited::accept(); ++} ++ ++void ++KDMAdmin::verifyPluginChanged( int id ) ++{ ++ curPlugin = id; ++ adjustSize(); ++} ++ ++void ++KDMAdmin::verifyOk() ++{ ++ bye_bye(); ++} ++ ++void ++KDMAdmin::verifyFailed() ++{ ++ okButton->setEnabled( false ); ++ cancelButton->setEnabled( false ); ++} ++ ++void ++KDMAdmin::verifyRetry() ++{ ++ okButton->setEnabled( true ); ++ cancelButton->setEnabled( true ); ++} ++ ++void ++KDMAdmin::verifySetUser( const QString & ) ++{ ++} ++ ++ ++#include "kdmadmindialog.moc" +Index: kdm/kfrontend/kdmadmindialog.h +=================================================================== +--- /dev/null ++++ kdm/kfrontend/kdmadmindialog.h +@@ -0,0 +1,70 @@ ++ /* ++ ++ Shutdown dialog ++ ++ Copyright (C) 1997, 1998 Steffen Hansen <hansen@kde.org> ++ Copyright (C) 2000-2003 Oswald Buddenhagen <ossi@kde.org> ++ ++ ++ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ */ ++ ++ ++#ifndef KDMADMIN_H ++#define KDMADMIN_H ++ ++#include "kgverify.h" ++ ++#include <qradiobutton.h> ++ ++class LiloInfo; ++class QLabel; ++class KPushButton; ++class QButtonGroup; ++class QComboBox; ++ ++class KDMAdmin : public FDialog, public KGVerifyHandler { ++ Q_OBJECT ++ typedef FDialog inherited; ++ ++public: ++ KDMAdmin( const QString &user, QWidget *_parent = 0 ); ++ ~KDMAdmin(); ++ ++public slots: ++ void accept(); ++ void slotWhenChanged(); ++ void slotActivatePlugMenu(); ++ ++private: ++ void bye_bye(); ++ ++ KPushButton *okButton, *cancelButton; ++ KGStdVerify *verify; ++ QString curUser; ++ ++ static int curPlugin; ++ static PluginList pluginList; ++ ++public: // from KGVerifyHandler ++ virtual void verifyPluginChanged( int id ); ++ virtual void verifyOk(); ++ virtual void verifyFailed(); ++ virtual void verifyRetry(); ++ virtual void verifySetUser( const QString &user ); ++}; ++ ++#endif +Index: kdm/kfrontend/kgreeter.cpp +=================================================================== +--- kdm/kfrontend/kgreeter.cpp.orig ++++ kdm/kfrontend/kgreeter.cpp +@@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include "kdmconfig.h" + #include "kdmclock.h" + #include "kdm_greet.h" ++#include "kdmadmindialog.h" + #include "themer/kdmthemer.h" + #include "themer/kdmitem.h" + #include "themer/kdmlabel.h" +@@ -509,7 +510,7 @@ KGreeter::insertSessions() + for (char **dit = _sessionsDirs; *dit; ++dit) { + QStringList ents = QDir( *dit ).entryList(); + for (QStringList::ConstIterator it = ents.begin(); it != ents.end(); ++it) +- if ((*it).endsWith( ".desktop" )) { ++ if ((*it).endsWith( ".desktop" ) && !(*it).endsWith("admin.desktop")) { + KSimpleConfig dsk( QString( *dit ).append( '/' ).append( *it ) ); + dsk.setGroup( "Desktop Entry" ); + putSession( (*it).left( (*it).length() - 8 ), +@@ -648,6 +649,17 @@ KGreeter::slotLoadPrevWM() + return; + } + } else { ++ if (!strcmp(sess, "admin")) { ++ // need to get the original ++ GSendInt( G_GetDmrc); ++ GSendStr( "OrigSession"); ++ sess = GRecvStr(); ++ if (!sess) { ++ free(sess); ++ sess = strdup("default"); ++ } ++ } ++ + for (uint i = 0; i < sessionTypes.count() && !sessionTypes[i].hid; i++) + if (sessionTypes[i].type == sess) { + free( sess ); +@@ -998,6 +1010,12 @@ KThemedGreeter::KThemedGreeter() + } + } + ++ admin_button = themer->findNode( "admin_button"); ++ if ( admin_button ) { ++ if ( !_useAdminSession ) ++ admin_button->hide( true ); ++ } ++ + if (plugMenu) { + inserten( i18n("&Authentication Method"), 0, plugMenu ); + needSep = true; +@@ -1103,6 +1121,8 @@ KThemedGreeter::slotThemeActivated( cons + slotSessMenu(); + else if (id == "system_button") + slotActionMenu(); ++ else if (id == "admin_button") ++ slotAskAdminPassword(); + } + + void +@@ -1129,4 +1149,15 @@ KThemedGreeter::keyPressEvent( QKeyEvent + accept(); + } + ++void ++KThemedGreeter::slotAskAdminPassword() ++{ ++ KDMAdmin k(curUser, this); ++ if (k.exec()) { ++ GSendInt(G_Ready); ++ hide(); ++ done(ex_exit); ++ } ++} ++ + #include "kgreeter.moc" +Index: kdm/kfrontend/kgreeter.h +=================================================================== +--- kdm/kfrontend/kgreeter.h.orig ++++ kdm/kfrontend/kgreeter.h +@@ -146,6 +146,7 @@ class KThemedGreeter : public KGreeter { + void slotThemeActivated( const QString &id ); + void slotSessMenu(); + void slotActionMenu(); ++ void slotAskAdminPassword(); + + protected: + virtual void updateStatus( bool fail, bool caps, int timedleft ); +@@ -158,7 +159,7 @@ class KThemedGreeter : public KGreeter { + KdmThemer *themer; + KdmItem *caps_warning, *xauth_warning, *pam_error, *timed_label, + *console_rect, *userlist_rect, +- *session_button, *system_button; ++ *session_button, *system_button, *admin_button; + + public: // from KGVerifyHandler + virtual void verifyFailed(); +Index: kdm/kfrontend/sessions/Makefile.am +=================================================================== +--- kdm/kfrontend/sessions/Makefile.am.orig ++++ kdm/kfrontend/sessions/Makefile.am +@@ -1,6 +1,6 @@ + sessionsdir = $(kde_datadir)/kdm/sessions + sessions_DATA = \ +- kde.desktop gnome.desktop \ ++ admin.desktop kde.desktop gnome.desktop \ + 9wm.desktop \ + aewm++.desktop \ + aewm.desktop \ +Index: kdm/kfrontend/sessions/admin.desktop +=================================================================== +--- /dev/null ++++ kdm/kfrontend/sessions/admin.desktop +@@ -0,0 +1,7 @@ ++[Desktop Entry] ++Encoding=UTF-8 ++Type=XSession ++Exec=YaSTadminSession ++TryExec=YaSTadminSession ++Name=admin ++Comment=Yast Admin Session +Index: kdm/kfrontend/themer/kdmlabel.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmlabel.cpp.orig ++++ kdm/kfrontend/themer/kdmlabel.cpp +@@ -214,6 +214,7 @@ static const struct { + { "language", I18N_NOOP("&Language") }, + { "session", I18N_NOOP("Session &Type") }, + { "system", I18N_NOOP("&System") }, // i18n("Actions"); ++ { "admin", I18N_NOOP("&Administration") }, + { "disconnect", I18N_NOOP("&Disconnect") }, + { "quit", I18N_NOOP("&Quit") }, + { "halt", I18N_NOOP("Power O&ff") }, diff --git a/opensuse/core/tdebase/kdm-aliasing.diff b/opensuse/core/tdebase/kdm-aliasing.diff new file mode 100644 index 000000000..73fc86e54 --- /dev/null +++ b/opensuse/core/tdebase/kdm-aliasing.diff @@ -0,0 +1,11 @@ +Index: kdm/backend/Makefile.am +=================================================================== +--- kdm/backend/Makefile.am.orig ++++ kdm/backend/Makefile.am +@@ -1,5 +1,6 @@ + # forcibly remove thread-related defines & flags + AUTOMAKE_OPTIONS = foreign ++CFLAGS = $(XDM_CFLAGS) -fno-strict-aliasing + CPPFLAGS = $(USER_INCLUDES) $(X_INCLUDES) $(KRB4_INCS) $(KRB5_INCS) -I.. -I../.. + LDFLAGS = $(USER_LDFLAGS) $(X_LDFLAGS) $(X_RPATH) $(KRB4_RPATH) $(KRB5_RPATH) + LDADD = $(LIB_X11) -lXau $(LIBXDMCP) $(PASSWDLIBS) $(LIBSHADOW) $(LIBGEN) \ diff --git a/opensuse/core/tdebase/kdm-align-userlist-labels.diff b/opensuse/core/tdebase/kdm-align-userlist-labels.diff new file mode 100644 index 000000000..65accc55f --- /dev/null +++ b/opensuse/core/tdebase/kdm-align-userlist-labels.diff @@ -0,0 +1,46 @@ +Index: kdm/kfrontend/kgreeter.cpp +=================================================================== +--- kdm/kfrontend/kgreeter.cpp.orig ++++ kdm/kfrontend/kgreeter.cpp +@@ -59,6 +59,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <qtooltip.h> + #include <qaccel.h> + #include <qeventloop.h> ++#include <qbitmap.h> + + #include <pwd.h> + #include <grp.h> +@@ -313,6 +314,33 @@ KGreeter::insertUser( const QImage &defa + if ( p.isNull() ) + p = default_pix; + ++ const int size = 48; ++ const int wdiff = size - p.size().width(); ++ const int hdiff = size - p.size().height(); ++ if (wdiff>0 || hdiff>0) { ++ QPixmap pix(p); ++ QBitmap mask; ++ mask.convertFromImage(p.createAlphaMask()); ++ pix.resize(size, size); ++ bitBlt(&pix, wdiff/2.0, hdiff/2.0, &pix); ++ if (mask.isNull()) { ++ mask = QBitmap(size, size); ++ mask.fill(Qt::color1); ++ } ++ else { ++ mask.resize(size, size); ++ bitBlt(&mask, wdiff/2.0, hdiff/2.0, &mask); ++ } ++ QPainter pa(&mask); ++ pa.fillRect(0, 0, size, hdiff/2.0, Qt::color0); ++ pa.fillRect(0, 0, wdiff/2.0, size, Qt::color0); ++ pa.fillRect(size-(wdiff/2.0), 0, size, size, Qt::color0); ++ pa.fillRect(0, size-(hdiff/2.0), size, size, Qt::color0); ++ pa.end(); ++ pix.setMask(mask); ++ p=pix.convertToImage(); ++ } ++ + QString realname = KStringHandler::from8Bit( ps->pw_gecos ); + realname.truncate( realname.find( ',' ) ); + if (realname.isEmpty() || realname == username) diff --git a/opensuse/core/tdebase/kdm-all-users-nopass.diff b/opensuse/core/tdebase/kdm-all-users-nopass.diff new file mode 100644 index 000000000..612c6a553 --- /dev/null +++ b/opensuse/core/tdebase/kdm-all-users-nopass.diff @@ -0,0 +1,34 @@ +Index: kdm/backend/client.c +=================================================================== +--- kdm/backend/client.c.orig ++++ kdm/backend/client.c +@@ -386,6 +386,9 @@ AccNoPass( const char *un, struct passwd + if (cursource != PWSRC_MANUAL) + return 1; + ++ if (td->noPassAllUsers) ++ return 1; ++ + for (hg = 0, fp = td->noPassUsers; *fp; fp++) + if (**fp == '@') + hg = 1; +Index: kdm/config.def +=================================================================== +--- kdm/config.def.orig ++++ kdm/config.def +@@ -1852,6 +1852,15 @@ Description: + (and any other user with UID = 0). + <emphasis>Never</emphasis> list <systemitem class="username">root</systemitem>. + ++Key: NoPassAllUsers ++Type: bool ++Default: false ++User: core ++Instance: #:0/true ++Comment: & ++Description: ++ All users can login without password ++ + Key: AutoLoginEnable + Type: bool + Default: false diff --git a/opensuse/core/tdebase/kdm-audit-log.diff b/opensuse/core/tdebase/kdm-audit-log.diff new file mode 100644 index 000000000..de571e44d --- /dev/null +++ b/opensuse/core/tdebase/kdm-audit-log.diff @@ -0,0 +1,190 @@ +Index: kdm/backend/client.c +=================================================================== +--- kdm/backend/client.c.orig ++++ kdm/backend/client.c +@@ -87,6 +87,14 @@ extern int loginsuccess( const char *Use + #include "consolekit.h" + #endif + ++#define AU_FAILED 0 ++#define AU_SUCCESS 1 ++#ifdef HAVE_LIBAUDIT ++#include <libaudit.h> ++#else ++#define log_to_audit_system(l,h,d,s) do { ; } while (0) ++#endif ++ + /* + * Session data, mostly what struct verify_info was for + */ +@@ -291,6 +299,56 @@ fail_delay( int retval ATTR_UNUSED, unsi + {} + # endif + ++ /** ++ * log_to_audit_system: ++ * @login: Name of user ++ * @hostname: Name of host machine ++ * @tty: Name of display ++ * @success: 1 for success, 0 for failure ++ * ++ * Logs the success or failure of the login attempt with the linux kernel ++ * audit system. The intent is to capture failed events where the user ++ * fails authentication or otherwise is not permitted to login. There are ++ * many other places where pam could potentially fail and cause login to ++ * fail, but these are system failures rather than the signs of an account ++ * being hacked. ++ * ++ * Returns nothing. ++ */ ++ ++#ifdef HAVE_LIBAUDIT ++static void ++log_to_audit_system (const char *loginname, ++ const char *hostname, ++ const char *tty, ++ int success) ++{ ++ struct passwd *pw; ++ char buf[64]; ++ int audit_fd; ++ ++ audit_fd = audit_open(); ++ if (loginname) ++ pw = getpwnam(loginname); ++ else { ++ loginname = "unknown"; ++ pw = NULL; ++ } ++ Debug("log_to_audit %p %s\n", pw, loginname); ++ ++ if (pw) { ++ snprintf(buf, sizeof(buf), "uid=%d", pw->pw_uid); ++ audit_log_user_message(audit_fd, AUDIT_USER_LOGIN, ++ buf, hostname, NULL, tty, (int)success); ++ } else { ++ snprintf(buf, sizeof(buf), "acct=%s", loginname); ++ audit_log_user_message(audit_fd, AUDIT_USER_LOGIN, ++ buf, hostname, NULL, tty, (int)success); ++ } ++ close(audit_fd); ++} ++#endif ++ + static int + doPAMAuth( const char *psrv, struct pam_data *pdata ) + { +@@ -349,6 +407,8 @@ doPAMAuth( const char *psrv, struct pam_ + GSendStr( curuser ); + } + if (pretc != PAM_SUCCESS) { ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + switch (pretc) { + case PAM_USER_UNKNOWN: + case PAM_AUTH_ERR: +@@ -702,6 +762,8 @@ Verify( GConvFunc gconv, int rootok ) + if (!p->pw_uid) { + if (!rootok && !td->allowRootLogin) + V_RET_FAIL( "Root logins are not allowed" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + return 1; /* don't deny root to log in */ + } + +@@ -738,6 +800,8 @@ Verify( GConvFunc gconv, int rootok ) + } + if (pretc == PAM_SUCCESS) + break; ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + /* effectively there is only PAM_AUTHTOK_ERR */ + GSendInt( V_FAIL ); + } +@@ -827,6 +891,8 @@ Verify( GConvFunc gconv, int rootok ) + GSendInt( V_MSG_ERR ); + GSendStr( "Your account has expired;" + " please contact your system administrator" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + GSendInt( V_FAIL ); + LC_RET0; + } else if (tim > (expir - warntime) && !quietlog) { +@@ -861,6 +927,8 @@ Verify( GConvFunc gconv, int rootok ) + GSendInt( V_MSG_ERR ); + GSendStr( "Your account has expired;" + " please contact your system administrator" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + GSendInt( V_FAIL ); + LC_RET0; + } +@@ -920,6 +988,8 @@ Verify( GConvFunc gconv, int rootok ) + close( fd ); + } + GSendStr( "Logins are not allowed at the moment.\nTry again later" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + GSendInt( V_FAIL ); + LC_RET0; + } +@@ -930,6 +1000,8 @@ Verify( GConvFunc gconv, int rootok ) + PrepErrorGreet(); + GSendInt( V_MSG_ERR ); + GSendStr( "You are not allowed to login at the moment" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + GSendInt( V_FAIL ); + LC_RET0; + } +@@ -941,6 +1013,8 @@ Verify( GConvFunc gconv, int rootok ) + Debug( "shell not in /etc/shells\n" ); + endusershell(); + V_RET_FAIL( "Your login shell is not listed in /etc/shells" ); ++ /* Log the failed login attempt */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED); + } + if (!strcmp( s, p->pw_shell )) { + endusershell(); +@@ -1365,6 +1439,9 @@ StartClient() + # define D_LOGIN_SETGROUP 0 + #endif /* USE_PAM */ + ++ /* Login succeeded */ ++ log_to_audit_system (curuser, td->remoteHost, td->name, AU_SUCCESS); ++ + removeAuth = 1; + chownCtrl( &td->ctrl, curuid ); + endpwent(); +Index: kdm/configure.in.in +=================================================================== +--- kdm/configure.in.in.orig ++++ kdm/configure.in.in +@@ -288,3 +288,27 @@ fi + AC_SUBST(DBUS_LIBS) + + dnl AC_OUTPUT(kdm/kfrontend/sessions/kde.desktop) ++ ++ ++AC_ARG_WITH(libaudit, ++ [ --with-libaudit=[auto/yes/no] Add Linux audit support [default=auto]],, ++ with_libaudit=auto) ++ ++# Check for Linux auditing API ++# ++# libaudit detection ++if test x$with_libaudit = xno ; then ++ have_libaudit=no; ++else ++ # See if we have audit daemon library ++ AC_CHECK_LIB(audit, audit_log_user_message, ++ have_libaudit=yes, have_libaudit=no) ++fi ++ ++AM_CONDITIONAL(HAVE_LIBAUDIT, test x$have_libaudit = xyes) ++ ++if test x$have_libaudit = xyes ; then ++ EXTRA_DAEMON_LIBS="$EXTRA_DAEMON_LIBS -laudit" ++ AC_DEFINE(HAVE_LIBAUDIT,1,[linux audit support]) ++fi ++ diff --git a/opensuse/core/tdebase/kdm-color-scheme.diff b/opensuse/core/tdebase/kdm-color-scheme.diff new file mode 100644 index 000000000..f45486ad1 --- /dev/null +++ b/opensuse/core/tdebase/kdm-color-scheme.diff @@ -0,0 +1,28 @@ +Index: kdm/kfrontend/kgapp.cpp +=================================================================== +--- kdm/kfrontend/kgapp.cpp.orig ++++ kdm/kfrontend/kgapp.cpp +@@ -42,6 +42,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <qtimer.h> + #include <qcursor.h> + #include <qpalette.h> ++#include <qfile.h> + + #include <stdlib.h> // free(), exit() + #include <unistd.h> // alarm() +@@ -144,7 +145,14 @@ kg_main( const char *argv0 ) + if (!_GUIStyle.isEmpty()) + app.setStyle( _GUIStyle ); + +- _colorScheme = locate( "data", "kdisplay/color-schemes/" + _colorScheme + ".kcsrc" ); ++ const QString _configColorScheme = _colorScheme; ++ ++ if (_useTheme && !_theme.isEmpty()) ++ _colorScheme = _theme + "/color.kcsrc"; ++ ++ if (!QFile::exists(_colorScheme)) ++ _colorScheme = locate( "data", "kdisplay/color-schemes/" + _configColorScheme + ".kcsrc" ); ++ + if (!_colorScheme.isEmpty()) { + KSimpleConfig config( _colorScheme, true ); + config.setGroup( "Color Scheme" ); diff --git a/opensuse/core/tdebase/kdm-consolekit.diff b/opensuse/core/tdebase/kdm-consolekit.diff new file mode 100644 index 000000000..9b4df34bc --- /dev/null +++ b/opensuse/core/tdebase/kdm-consolekit.diff @@ -0,0 +1,822 @@ +Index: kdm/backend/client.c +=================================================================== +--- kdm/backend/client.c.orig ++++ kdm/backend/client.c +@@ -83,6 +83,10 @@ extern int loginsuccess( const char *Use + #endif + #include <signal.h> + ++#ifdef WITH_CONSOLE_KIT ++#include "consolekit.h" ++#endif ++ + /* + * Session data, mostly what struct verify_info was for + */ +@@ -1124,8 +1128,13 @@ static int removeSession; + static int removeCreds; + #endif + ++#ifdef WITH_CONSOLE_KIT ++int ++StartClient( const char *ck_session_cookie ) ++#else + int + StartClient() ++#endif + { + const char *home, *sessargs, *desksess; + char **env, *xma; +@@ -1223,6 +1232,11 @@ StartClient() + if (krbtkfile[0] != '\0') + env = setEnv( env, "KRBTKFILE", krbtkfile ); + #endif ++#ifdef WITH_CONSOLE_KIT ++ if (ck_session_cookie != NULL) { ++ env = setEnv ( env, "XDG_SESSION_COOKIE", ck_session_cookie ); ++ } ++#endif + userEnviron = inheritEnv( env, envvars ); + env = systemEnv( p->pw_name ); + systemEnviron = setEnv( env, "HOME", p->pw_dir ); +Index: kdm/backend/consolekit.c +=================================================================== +--- /dev/null ++++ kdm/backend/consolekit.c +@@ -0,0 +1,552 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2006-2007 William Jon McCann <mccann@jhu.edu> ++ * Copyright (C) 2007 Kevin Kofler <Kevin@tigcc.ticalc.org> ++ * ++ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++#include "dm.h" ++#include "dm_auth.h" ++#include "dm_error.h" ++ ++#include <stdlib.h> ++#include <string.h> ++#include <pwd.h> ++ ++#define DBUS_API_SUBJECT_TO_CHANGE ++#include <dbus/dbus.h> ++ ++#include "consolekit.h" ++ ++ ++#define CK_NAME "org.freedesktop.ConsoleKit" ++#define CK_PATH "/org/freedesktop/ConsoleKit" ++#define CK_INTERFACE "org.freedesktop.ConsoleKit" ++#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager" ++#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager" ++#define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session" ++ ++static DBusConnection *private_connection = NULL; ++ ++static void ++add_param_int (DBusMessageIter *iter_struct, ++ const char *key, ++ int value) ++{ ++ DBusMessageIter iter_struct_entry; ++ DBusMessageIter iter_var; ++ ++ dbus_message_iter_open_container (iter_struct, ++ DBUS_TYPE_STRUCT, ++ NULL, ++ &iter_struct_entry); ++ ++ dbus_message_iter_append_basic (&iter_struct_entry, ++ DBUS_TYPE_STRING, ++ &key); ++ ++ dbus_message_iter_open_container (&iter_struct_entry, ++ DBUS_TYPE_VARIANT, ++ DBUS_TYPE_INT32_AS_STRING, ++ &iter_var); ++ ++ dbus_message_iter_append_basic (&iter_var, ++ DBUS_TYPE_INT32, ++ &value); ++ ++ dbus_message_iter_close_container (&iter_struct_entry, ++ &iter_var); ++ ++ dbus_message_iter_close_container (iter_struct, &iter_struct_entry); ++} ++ ++static void ++add_param_boolean (DBusMessageIter *iter_struct, ++ const char *key, ++ int value) ++{ ++ DBusMessageIter iter_struct_entry; ++ DBusMessageIter iter_var; ++ ++ dbus_message_iter_open_container (iter_struct, ++ DBUS_TYPE_STRUCT, ++ NULL, ++ &iter_struct_entry); ++ ++ dbus_message_iter_append_basic (&iter_struct_entry, ++ DBUS_TYPE_STRING, ++ &key); ++ ++ dbus_message_iter_open_container (&iter_struct_entry, ++ DBUS_TYPE_VARIANT, ++ DBUS_TYPE_BOOLEAN_AS_STRING, ++ &iter_var); ++ ++ dbus_message_iter_append_basic (&iter_var, ++ DBUS_TYPE_BOOLEAN, ++ &value); ++ ++ dbus_message_iter_close_container (&iter_struct_entry, ++ &iter_var); ++ ++ dbus_message_iter_close_container (iter_struct, &iter_struct_entry); ++} ++ ++static void ++add_param_string (DBusMessageIter *iter_struct, ++ const char *key, ++ const char *value) ++{ ++ DBusMessageIter iter_struct_entry; ++ DBusMessageIter iter_var; ++ ++ dbus_message_iter_open_container (iter_struct, ++ DBUS_TYPE_STRUCT, ++ NULL, ++ &iter_struct_entry); ++ ++ dbus_message_iter_append_basic (&iter_struct_entry, ++ DBUS_TYPE_STRING, ++ &key); ++ ++ dbus_message_iter_open_container (&iter_struct_entry, ++ DBUS_TYPE_VARIANT, ++ DBUS_TYPE_STRING_AS_STRING, ++ &iter_var); ++ ++ dbus_message_iter_append_basic (&iter_var, ++ DBUS_TYPE_STRING, ++ &value); ++ ++ dbus_message_iter_close_container (&iter_struct_entry, ++ &iter_var); ++ ++ dbus_message_iter_close_container (iter_struct, &iter_struct_entry); ++} ++ ++static int ++session_get_x11_display (DBusConnection *connection, ++ const char *ssid, ++ char **str) ++{ ++ DBusError error; ++ DBusMessage *message; ++ DBusMessage *reply; ++ DBusMessageIter iter; ++ const char *value; ++ ++ if (str != NULL) { ++ *str = NULL; ++ } ++ ++ message = dbus_message_new_method_call (CK_NAME, ++ ssid, ++ CK_SESSION_INTERFACE, ++ "GetX11Display"); ++ if (message == NULL) { ++ Debug ("ConsoleKit: Couldn't allocate the D-Bus message"); ++ return FALSE; ++ } ++ ++ dbus_error_init (&error); ++ reply = dbus_connection_send_with_reply_and_block (connection, ++ message, ++ -1, &error); ++ if (dbus_error_is_set (&error)) { ++ Debug ("ConsoleKit: %s raised:\n %s\n\n", error.name, error.message); ++ reply = NULL; ++ } ++ ++ dbus_connection_flush (connection); ++ dbus_message_unref (message); ++ ++ if (reply == NULL) { ++ return FALSE; ++ } ++ ++ dbus_message_iter_init (reply, &iter); ++ dbus_message_iter_get_basic (&iter, &value); ++ if (str != NULL) { ++ *str = strdup (value); ++ } ++ dbus_message_unref (reply); ++ ++ return TRUE; ++} ++ ++static int ++session_unlock (DBusConnection *connection, ++ const char *ssid) ++{ ++ DBusError error; ++ DBusMessage *message; ++ DBusMessage *reply; ++ ++ Debug ("ConsoleKit: Unlocking session %s", ssid); ++ message = dbus_message_new_method_call (CK_NAME, ++ ssid, ++ CK_SESSION_INTERFACE, ++ "Unlock"); ++ if (message == NULL) { ++ Debug ("ConsoleKit: Couldn't allocate the D-Bus message"); ++ return FALSE; ++ } ++ ++ dbus_error_init (&error); ++ reply = dbus_connection_send_with_reply_and_block (connection, ++ message, ++ -1, &error); ++ dbus_message_unref (message); ++ dbus_message_unref (reply); ++ dbus_connection_flush (connection); ++ ++ if (dbus_error_is_set (&error)) { ++ Debug ("ConsoleKit: %s raised:\n %s\n\n", error.name, error.message); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++/* from libhal */ ++static char ** ++get_path_array_from_iter (DBusMessageIter *iter, ++ int *num_elements) ++{ ++ int count; ++ char **buffer; ++ ++ count = 0; ++ buffer = (char **)malloc (sizeof (char *) * 8); ++ ++ if (buffer == NULL) ++ goto oom; ++ ++ buffer[0] = NULL; ++ while (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_OBJECT_PATH) { ++ const char *value; ++ char *str; ++ ++ if ((count % 8) == 0 && count != 0) { ++ buffer = realloc (buffer, sizeof (char *) * (count + 8)); ++ if (buffer == NULL) ++ goto oom; ++ } ++ ++ dbus_message_iter_get_basic (iter, &value); ++ str = strdup (value); ++ if (str == NULL) ++ goto oom; ++ ++ buffer[count] = str; ++ ++ dbus_message_iter_next (iter); ++ count++; ++ } ++ ++ if ((count % 8) == 0) { ++ buffer = realloc (buffer, sizeof (char *) * (count + 1)); ++ if (buffer == NULL) ++ goto oom; ++ } ++ ++ buffer[count] = NULL; ++ if (num_elements != NULL) ++ *num_elements = count; ++ return buffer; ++ ++oom: ++ LogWarn ("%s %d : error allocating memory\n", __FILE__, __LINE__); ++ return NULL; ++ ++} ++ ++static char ** ++get_sessions_for_user (DBusConnection *connection, ++ const char *user, ++ const char *x11_display) ++{ ++ DBusError error; ++ DBusMessage *message; ++ DBusMessage *reply; ++ DBusMessageIter iter; ++ DBusMessageIter iter_reply; ++ DBusMessageIter iter_array; ++ struct passwd *pwent; ++ char **sessions; ++ ++ sessions = NULL; ++ message = NULL; ++ reply = NULL; ++ ++ pwent = getpwnam (user); ++ ++ dbus_error_init (&error); ++ message = dbus_message_new_method_call (CK_NAME, ++ CK_MANAGER_PATH, ++ CK_MANAGER_INTERFACE, ++ "GetSessionsForUser"); ++ if (message == NULL) { ++ Debug ("ConsoleKit: Couldn't allocate the D-Bus message"); ++ goto out; ++ } ++ ++ dbus_message_iter_init_append (message, &iter); ++ dbus_message_iter_append_basic (&iter, ++ DBUS_TYPE_UINT32, ++ &pwent->pw_uid); ++ ++ dbus_error_init (&error); ++ reply = dbus_connection_send_with_reply_and_block (connection, ++ message, ++ -1, &error); ++ dbus_connection_flush (connection); ++ ++ if (dbus_error_is_set (&error)) { ++ Debug ("ConsoleKit: %s raised:\n %s\n\n", error.name, error.message); ++ goto out; ++ } ++ ++ if (reply == NULL) { ++ Debug ("ConsoleKit: No reply for GetSessionsForUser"); ++ goto out; ++ } ++ ++ dbus_message_iter_init (reply, &iter_reply); ++ if (dbus_message_iter_get_arg_type (&iter_reply) != DBUS_TYPE_ARRAY) { ++ Debug ("ConsoleKit: Wrong reply for GetSessionsForUser - expecting an array."); ++ goto out; ++ } ++ ++ dbus_message_iter_recurse (&iter_reply, &iter_array); ++ sessions = get_path_array_from_iter (&iter_array, NULL); ++ ++ out: ++ if (message != NULL) { ++ dbus_message_unref (message); ++ } ++ if (reply != NULL) { ++ dbus_message_unref (reply); ++ } ++ ++ return sessions; ++} ++ ++void ++unlock_ck_session (const char *user, ++ const char *x11_display) ++{ ++ DBusError error; ++ DBusConnection *connection; ++ char **sessions; ++ int i; ++ ++ Debug ("ConsoleKit: Unlocking session for %s on %s", user, x11_display); ++ ++ dbus_error_init (&error); ++ connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); ++ if (connection == NULL) { ++ Debug ("ConsoleKit: Failed to connect to the D-Bus daemon: %s", error.message); ++ dbus_error_free (&error); ++ return; ++ } ++ ++ sessions = get_sessions_for_user (connection, user, x11_display); ++ if (sessions == NULL || sessions[0] == NULL) { ++ Debug ("ConsoleKit: no sessions found"); ++ return; ++ } ++ ++ for (i = 0; sessions[i] != NULL; i++) { ++ char *ssid; ++ char *xdisplay; ++ ++ ssid = sessions[i]; ++ session_get_x11_display (connection, ssid, &xdisplay); ++ Debug ("ConsoleKit: session %s has DISPLAY %s", ssid, xdisplay); ++ ++ if (xdisplay != NULL ++ && x11_display != NULL ++ && strcmp (xdisplay, x11_display) == 0) { ++ int res; ++ ++ res = session_unlock (connection, ssid); ++ if (! res) { ++ LogError ("ConsoleKit: Unable to unlock %s", ssid); ++ } ++ } ++ ++ free (xdisplay); ++ } ++ ++ freeStrArr (sessions); ++} ++ ++char * ++open_ck_session (struct passwd *pwent, ++ struct display *d) ++{ ++ DBusConnection *connection; ++ DBusError error; ++ DBusMessage *message; ++ DBusMessage *reply; ++ DBusMessageIter iter; ++ DBusMessageIter iter_struct; ++ char *cookie; ++ ++ cookie = NULL; ++ ++ Debug ("ConsoleKit: Opening session for %s", pwent->pw_name); ++ ++ dbus_error_init (&error); ++ connection = dbus_bus_get_private (DBUS_BUS_SYSTEM, &error); ++ private_connection = connection; ++ ++ if (connection == NULL) { ++ Debug ("ConsoleKit: Failed to connect to the D-Bus daemon: %s", error.message); ++ dbus_error_free (&error); ++ return NULL; ++ } ++ ++ dbus_connection_set_exit_on_disconnect (connection, FALSE); ++ /* FIXME: What to do about these? ++ dbus_connection_set_watch_functions( connection, ++ dbusAddWatch, ++ dbusRemoveWatch, ++ dbusToggleWatch, ++ data, 0 ); ++ dbus_connection_set_timeout_functions( connection, ++ dbusAddTimeout, ++ dbusRemoveTimeout, ++ dbusToggleTimeout, ++ data, 0 ); ++ dbus_connection_set_wakeup_main_function( connection, ++ dbusWakeupMain, ++ data, 0 ); */ ++ ++ dbus_error_init (&error); ++ message = dbus_message_new_method_call (CK_NAME, ++ CK_MANAGER_PATH, ++ CK_MANAGER_INTERFACE, ++ "OpenSessionWithParameters"); ++ if (message == NULL) { ++ Debug ("ConsoleKit: Couldn't allocate the D-Bus message"); ++ return NULL; ++ } ++ ++ dbus_message_iter_init_append (message, &iter); ++ dbus_message_iter_open_container (&iter, ++ DBUS_TYPE_ARRAY, ++ DBUS_STRUCT_BEGIN_CHAR_AS_STRING ++ DBUS_TYPE_STRING_AS_STRING ++ DBUS_TYPE_VARIANT_AS_STRING ++ DBUS_STRUCT_END_CHAR_AS_STRING, ++ &iter_struct); ++ ++ add_param_int (&iter_struct, "user", pwent->pw_uid); ++ add_param_string (&iter_struct, "x11-display", d->name); ++ add_param_boolean (&iter_struct, "is-local", ((d->displayType & d_location) == dLocal)); ++#ifdef XDMCP ++ if (d->status == remoteLogin && !((d->displayType & d_location) == dLocal)) { ++ add_param_string (&iter_struct, "remote-host-name", d->remoteHost); ++ } ++#endif ++ ++#ifdef HAVE_VTS ++ if (d->serverVT > 0) { ++ char device[20]; ++ ++ /* FIXME: how does xorg construct this */ ++ sprintf(device, "/dev/tty%d", d->serverVT); ++ add_param_string (&iter_struct, "x11-display-device", device); ++ } ++#endif ++ ++ dbus_message_iter_close_container (&iter, &iter_struct); ++ ++ reply = dbus_connection_send_with_reply_and_block (connection, ++ message, ++ -1, &error); ++ if (dbus_error_is_set (&error)) { ++ Debug ("ConsoleKit: %s raised:\n %s\n\n", error.name, error.message); ++ reply = NULL; ++ } ++ ++ dbus_connection_flush (connection); ++ ++ dbus_message_unref (message); ++ dbus_error_free (&error); ++ ++ if (reply != NULL) { ++ const char *value; ++ ++ dbus_message_iter_init (reply, &iter); ++ dbus_message_iter_get_basic (&iter, &value); ++ cookie = strdup (value); ++ dbus_message_unref (reply); ++ } ++ ++ return cookie; ++} ++ ++void ++close_ck_session (const char *cookie) ++{ ++ DBusError error; ++ DBusMessage *message; ++ DBusMessage *reply; ++ DBusMessageIter iter; ++ ++ if (cookie == NULL) { ++ return; ++ } ++ ++ if (private_connection == NULL) { ++ return; ++ } ++ ++ dbus_error_init (&error); ++ message = dbus_message_new_method_call (CK_NAME, ++ CK_MANAGER_PATH, ++ CK_MANAGER_INTERFACE, ++ "CloseSession"); ++ if (message == NULL) { ++ Debug ("ConsoleKit: Couldn't allocate the D-Bus message"); ++ return; ++ } ++ ++ dbus_message_iter_init_append (message, &iter); ++ dbus_message_iter_append_basic (&iter, ++ DBUS_TYPE_STRING, ++ &cookie); ++ ++ reply = dbus_connection_send_with_reply_and_block (private_connection, ++ message, ++ -1, &error); ++ if (dbus_error_is_set (&error)) { ++ Debug ("ConsoleKit: %s raised:\n %s\n\n", error.name, error.message); ++ reply = NULL; ++ } ++ ++ dbus_connection_flush (private_connection); ++ ++ dbus_message_unref (message); ++ dbus_error_free (&error); ++ ++ dbus_connection_close (private_connection); ++ private_connection = NULL; ++} +Index: kdm/backend/consolekit.h +=================================================================== +--- /dev/null ++++ kdm/backend/consolekit.h +@@ -0,0 +1,36 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- ++ * ++ * Copyright (C) 2006 William Jon McCann <mccann@jhu.edu> ++ * Copyright (C) 2007 Kevin Kofler <Kevin@tigcc.ticalc.org> ++ * ++ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ ++#ifndef __CONSOLE_KIT_H ++#define __CONSOLE_KIT_H ++ ++#include <pwd.h> ++ ++struct display; ++ ++char * open_ck_session (struct passwd *pwent, ++ struct display *display); ++void close_ck_session (const char *cookie); ++void unlock_ck_session (const char *user, ++ const char *x11_display); ++ ++#endif /* __CONSOLE_KIT_H */ +Index: kdm/backend/dm.h +=================================================================== +--- kdm/backend/dm.h.orig ++++ kdm/backend/dm.h +@@ -37,6 +37,8 @@ from the copyright holder. + #ifndef _DM_H_ + #define _DM_H_ 1 + ++#define WITH_CONSOLE_KIT ++ + #include "greet.h" + #include <config.ci> + +@@ -476,7 +478,11 @@ char **GRecvArgv( void ); + #define GCONV_BINARY 5 + typedef char *(*GConvFunc)( int what, const char *prompt ); + int Verify( GConvFunc gconv, int rootok ); ++#ifdef WITH_CONSOLE_KIT ++int StartClient( const char *ck_session_cookie ); ++#else + int StartClient( void ); ++#endif + void SessionExit( int status ) ATTR_NORETURN; + int ReadDmrc( void ); + extern char **userEnviron, **systemEnviron; +Index: kdm/backend/Imakefile +=================================================================== +--- kdm/backend/Imakefile.orig ++++ kdm/backend/Imakefile +@@ -155,13 +155,13 @@ PROCTITLE_DEFINES = -DHAS_SETPROCTITLE + netaddr.c reset.c resource.c protodpy.c policy.c \ + session.c socket.c streams.c util.c xdmcp.c \ + process.c mitauth.c \ +- genauth.c access.c choose.c \ ++ genauth.c access.c choose.c consolekit.c \ + $(XDMAUTHSRCS) $(RPCSRCS) $(KRB5SRCS) + COMMOBJS = auth.o daemon.o server.o dpylist.o dm.o error.o \ + netaddr.o reset.o resource.o protodpy.o policy.o \ + session.o socket.o streams.o util.o xdmcp.o \ + process.o mitauth.o \ +- genauth.o access.o choose.o \ ++ genauth.o access.o choose.o consolekit.o \ + $(XDMAUTHOBJS) $(RPCOBJS) $(KRB5OBJS) + + SRCS1 = $(COMMSRCS) client.c +Index: kdm/backend/Makefile.am +=================================================================== +--- kdm/backend/Makefile.am.orig ++++ kdm/backend/Makefile.am +@@ -1,6 +1,6 @@ + # forcibly remove thread-related defines & flags + AUTOMAKE_OPTIONS = foreign +-AM_CPPFLAGS = $(USER_INCLUDES) $(X_INCLUDES) $(KRB4_INCS) $(KRB5_INCS) -I.. -I../.. ++AM_CPPFLAGS = -DWITH_CONSOLE_KIT=1 $(USER_INCLUDES) $(X_INCLUDES) $(KRB4_INCS) $(KRB5_INCS) $(DBUS_INCS) -I.. -I../.. + + bin_PROGRAMS = kdm + kdm_SOURCES = \ +@@ -9,6 +9,7 @@ kdm_SOURCES = \ + bootman.c \ + choose.c \ + client.c \ ++ consolekit.c \ + ctrl.c \ + daemon.c \ + dm.c \ +@@ -37,7 +38,7 @@ kdm_SOURCES = \ + kdm_LDFLAGS = $(USER_LDFLAGS) $(X_LDFLAGS) $(X_RPATH) $(KRB4_RPATH) $(KRB5_RPATH) + kdm_LDADD = $(LIB_X11) -lXau $(LIBXDMCP) $(PASSWDLIBS) \ + $(LIB_LIBS) $(KRB4_LIBS) $(KRB5_LIBS) $(LIBSOCKET) $(LIBRESOLV) \ +- $(LIBUCB) $(LIBUTIL) $(LIBPOSIX4) ++ $(DBUS_LIBS) $(LIBUCB) $(LIBUTIL) $(LIBPOSIX4) + + EXTRA_DIST = printf.c + +Index: kdm/backend/session.c +=================================================================== +--- kdm/backend/session.c.orig ++++ kdm/backend/session.c +@@ -45,6 +45,10 @@ from the copyright holder. + #include <ctype.h> + #include <signal.h> + ++#ifdef WITH_CONSOLE_KIT ++#include "consolekit.h" ++#endif ++ + struct display *td; + const char *td_setup = "auto"; + +@@ -530,6 +534,9 @@ ManageSession( struct display *d ) + int ex, cmd; + volatile int clientPid = 0; + volatile Time_t tdiff = 0; ++#ifdef WITH_CONSOLE_KIT ++ char *ck_session_cookie; ++#endif + + td = d; + Debug( "ManageSession %s\n", d->name ); +@@ -626,7 +633,12 @@ ManageSession( struct display *d ) + if (td_setup) + SetupDisplay( td_setup ); + ++#ifdef WITH_CONSOLE_KIT ++ ck_session_cookie = open_ck_session (getpwnam(curuser), d); ++ if (!(clientPid = StartClient(ck_session_cookie))) { ++#else + if (!(clientPid = StartClient())) { ++#endif + LogError( "Client start failed\n" ); + SessionExit( EX_NORMAL ); /* XXX maybe EX_REMANAGE_DPY? -- enable in dm.c! */ + } +@@ -648,6 +660,14 @@ ManageSession( struct display *d ) + catchTerm( SIGTERM ); + } + } ++ ++#ifdef WITH_CONSOLE_KIT ++ if (ck_session_cookie != NULL) { ++ close_ck_session (ck_session_cookie); ++ free (ck_session_cookie); ++ } ++#endif ++ + /* + * Sometimes the Xsession somehow manages to exit before + * a server crash is noticed - so we sleep a bit and wait +Index: kdm/configure.in.in +=================================================================== +--- kdm/configure.in.in.orig ++++ kdm/configure.in.in +@@ -240,4 +240,51 @@ if test "x$with_kdm_xconsole" = xyes; th + AC_DEFINE(WITH_KDM_XCONSOLE, 1, [Build kdm with built-in xconsole]) + fi + ++########### Check for DBus ++ ++ AC_MSG_CHECKING(for DBus) ++ ++ dbus_inc=NOTFOUND ++ dbus_lib=NOTFOUND ++ dbus=NOTFOUND ++ ++ search_incs="$kde_includes $kde_extra_includes /usr/include /usr/include/dbus-1.0 /usr/local/include /usr/local/include/dbus-1.0" ++ AC_FIND_FILE(dbus/dbus.h, $search_incs, dbus_incdir) ++ ++ search_incs_arch_deps="$kde_includes $kde_extra_includes /usr/lib$kdelibsuff/dbus-1.0/include /usr/local/lib$kdelibsuff/dbus-1.0/include" ++ AC_FIND_FILE(dbus/dbus-arch-deps.h, $search_incs_arch_deps, dbus_incdir_arch_deps) ++ ++ if test -r $dbus_incdir/dbus/dbus.h && test -r $dbus_incdir_arch_deps/dbus/dbus-arch-deps.h ; then ++ DBUS_INCS="-I$dbus_incdir -I$dbus_incdir_arch_deps" ++ dbus_inc=FOUND ++ fi ++ ++ search_libs="$kde_libraries $kde_extra_libs /usr/lib$kdelibsuff /usr/local/lib$kdelibsuff" ++ AC_FIND_FILE(libdbus-1.so, $search_libs, dbus_libdir) ++ ++ if test -r $dbus_libdir/libdbus-1.so ; then ++ DBUS_LIBS="-L$dbus_libdir -ldbus-1" ++ dbus_lib=FOUND ++ fi ++ ++ if test $dbus_inc != FOUND || test $dbus_lib != FOUND ; then ++ KDE_PKG_CHECK_MODULES( DBUS, "dbus-1", [ DBUS_INCS=$DBUS_CFLAGS; dbus_inc=FOUND; dbus_lib=FOUND; ] , AC_MSG_RESULT( Nothing found on PKG_CONFIG_PATH ) ) ++ fi ++ ++ dbus_bus_var=`pkg-config --variable=system_bus_default_address dbus-1 2>/dev/null` ++ if test -z "$dbus_bus_var"; then ++ dbus_bus_var="unix:path=/var/run/dbus/system_bus_socket" ++ fi ++ AC_DEFINE_UNQUOTED(DBUS_SYSTEM_BUS, "$dbus_bus_var", [Define the unix domain path for dbus system bus]) ++ ++ if test $dbus_inc = FOUND && test $dbus_lib = FOUND ; then ++ AC_MSG_RESULT(headers $DBUS_INCS libraries $DBUS_LIBS) ++ dbus=FOUND ++ else ++ AC_MSG_RESULT(searched but not found) ++ fi ++ ++ AC_SUBST(DBUS_INCS) ++ AC_SUBST(DBUS_LIBS) ++ + dnl AC_OUTPUT(kdm/kfrontend/sessions/kde.desktop) diff --git a/opensuse/core/tdebase/kdm-cope-with-new-grub.diff b/opensuse/core/tdebase/kdm-cope-with-new-grub.diff new file mode 100644 index 000000000..cf28cf9be --- /dev/null +++ b/opensuse/core/tdebase/kdm-cope-with-new-grub.diff @@ -0,0 +1,27 @@ +Index: kdm/backend/bootman.c +=================================================================== +--- kdm/backend/bootman.c.orig ++++ kdm/backend/bootman.c +@@ -132,19 +132,14 @@ setGrub( const char *opt, SdRec *sdr ) + static void + commitGrub( void ) + { +- FILE *f; +- int pid; +- static const char *args[] = { 0, "--batch", "--no-floppy", 0 }; ++ char buffer[PATH_MAX]; + + if (sdRec.bmstamp != mTime( GRUB_MENU ) && + setGrub( sdRec.osname, &sdRec ) != BO_OK) + return; + +- args[0] = grub; +- if ((f = pOpen( (char **)args, 'w', &pid ))) { +- fprintf( f, "savedefault --default=%d --once\n", sdRec.osindex ); +- pClose( f, pid ); +- } ++ snprintf(buffer, PATH_MAX, "/usr/sbin/grubonce %d", sdRec.osindex); ++ system(buffer); + } + + static char *lilo; diff --git a/opensuse/core/tdebase/kdm-make_it_cool.diff b/opensuse/core/tdebase/kdm-make_it_cool.diff new file mode 100644 index 000000000..fb1f5b076 --- /dev/null +++ b/opensuse/core/tdebase/kdm-make_it_cool.diff @@ -0,0 +1,1534 @@ +Index: kdm/kfrontend/kdm_greet.c +=================================================================== +--- kdm/kfrontend/kdm_greet.c.orig ++++ kdm/kfrontend/kdm_greet.c +@@ -44,8 +44,8 @@ Foundation, Inc., 51 Franklin Street, Fi + # include <sched.h> + #endif + +-#if defined(HAVE_XTEST) || defined(HAVE_XKB) + # include <X11/Xlib.h> ++#if defined(HAVE_XTEST) || defined(HAVE_XKB) + # include <X11/keysym.h> + #endif + +Index: kdm/kfrontend/themer/kdmrect.h +=================================================================== +--- kdm/kfrontend/themer/kdmrect.h.orig ++++ kdm/kfrontend/themer/kdmrect.h +@@ -36,6 +36,7 @@ class KdmRect : public KdmItem { + + public: + KdmRect( KdmItem *parent, const QDomNode &node, const char *name = 0 ); ++ KdmRect( QWidget *parent, const QDomNode &node, const char *name = 0 ); + + protected: + // draw the rect +@@ -54,8 +55,9 @@ protected: + bool hasBorder; + } rect; + +-// virtual void setWidget( QWidget *widget ); ++ virtual void setWidget( QWidget *widget ); + // virtual void setLayoutItem( QLayoutItem *item ); ++ void init( const QDomNode &node, const char *name ); + + private: + void setAttribs( QWidget *widget ); +Index: kdm/kfrontend/themer/kdmitem.h +=================================================================== +--- kdm/kfrontend/themer/kdmitem.h.orig ++++ kdm/kfrontend/themer/kdmitem.h +@@ -90,6 +90,8 @@ public: + * Item constructor and destructor + */ + KdmItem( KdmItem *parent, const QDomNode &node = QDomNode(), const char *name = 0 ); ++ KdmItem( QWidget *parent, const QDomNode &node = QDomNode(), const char *name = 0 ); // for the root ++ + virtual ~KdmItem(); + + /** +@@ -151,6 +153,7 @@ public: + + KdmItem *findNode( const QString &id ) const; + virtual void setWidget( QWidget *widget ); ++ QWidget *widget() const { return myWidget; } + virtual void setLayoutItem( QLayoutItem *item ); + + virtual void hide( bool force = false ); +@@ -160,6 +163,9 @@ public: + bool isExplicitlyHidden() const { return isShown == ExplicitlyHidden; } + QRect rect() const { return area; } + ++ QWidget *parentWidget() const; ++ QString getId() const { return id; } ++ + signals: + void needUpdate( int x, int y, int w, int h ); + void activated( const QString &id ); +@@ -237,6 +243,7 @@ protected: + void parseColor( const QString &, QColor & ); + + void inheritFromButton( KdmItem *button ); ++ void init( const QDomNode &node = QDomNode(), const char *name = 0 ); + + QString itemType, id; + QValueList<KdmItem *> m_children; +Index: kdm/kfrontend/themer/kdmpixmap.h +=================================================================== +--- kdm/kfrontend/themer/kdmpixmap.h.orig ++++ kdm/kfrontend/themer/kdmpixmap.h +@@ -61,9 +61,10 @@ protected: + } pixmap; + + private: +- // Method to load the pixmap given by the theme +- void loadPixmap( const QString &fileName, QPixmap &p, QString &path ); ++ // Method to load the pixmap path given by the theme ++ QString fullPath( const QString &fileName ); + void renderSvg( PixmapStruct::PixmapClass *pClass, const QRect &area ); ++ void loadPixmap( PixmapStruct::PixmapClass *pClass ); + }; + + #endif +Index: kdm/kfrontend/themer/kdmlabel.h +=================================================================== +--- kdm/kfrontend/themer/kdmlabel.h.orig ++++ kdm/kfrontend/themer/kdmlabel.h +@@ -67,6 +67,7 @@ protected: + + public slots: + void update(); ++ void slotAccel(); + + private: + /* Method to lookup the caption associated with an item */ +@@ -76,6 +77,10 @@ private: + QString lookupText( const QString &t ); + + QString cText; ++ int cAccel; ++ QAccel *myAccel; ++ ++ void setTextInt(const QString &); + }; + + #endif +Index: kdm/kfrontend/themer/kdmthemer.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmthemer.cpp.orig ++++ kdm/kfrontend/themer/kdmthemer.cpp +@@ -36,11 +36,13 @@ + + #include <qfile.h> + #include <qfileinfo.h> +-//#include <qtimer.h> // animation timer - TODO ++#include <qtimer.h> // animation timer - TODO + #include <qobjectlist.h> + #include <qpainter.h> + #include <qwidget.h> + #include <qregion.h> ++#include <qlineedit.h> ++#include <qapplication.h> + + #include <unistd.h> + +@@ -72,7 +74,8 @@ KdmThemer::KdmThemer( const QString &_fi + return; + } + // Set the root (screen) item +- rootItem = new KdmRect( 0, QDomNode(), "kdm root" ); ++ rootItem = new KdmRect( parent, QDomNode(), "kdm root" ); ++ + connect( rootItem, SIGNAL(needUpdate( int, int, int, int )), + widget(), SLOT(update( int, int, int, int )) ); + +@@ -82,6 +85,9 @@ KdmThemer::KdmThemer( const QString &_fi + generateItems( rootItem ); + + connect( rootItem, SIGNAL(activated( const QString & )), SIGNAL(activated( const QString & )) ); ++ connect( rootItem, SIGNAL(activated( const QString & )), SLOT(slotActivated( const QString & )) ); ++ ++ QTimer::singleShot(800, this, SLOT(slotPaintRoot())); + + /* *TODO* + // Animation timer +@@ -151,7 +157,7 @@ KdmThemer::widgetEvent( QEvent *e ) + case QEvent::Paint: + { + QRect paintRect = static_cast<QPaintEvent *>(e)->rect(); +- kdDebug() << "paint on: " << paintRect << endl; ++ kdDebug() << timestamp() << " paint on: " << paintRect << endl; + + if (!backBuffer) + backBuffer = new QPixmap( widget()->size() ); +@@ -195,7 +201,7 @@ KdmThemer::generateItems( KdmItem *paren + + // Get its tag, and check it's correct ("greeter") + if (theme.tagName() != "greeter") { +- kdDebug() << "This does not seem to be a correct theme file." << endl; ++ kdDebug() << timestamp() << " This does not seem to be a correct theme file." << endl; + return; + } + // Get the list of child nodes +@@ -214,6 +220,13 @@ KdmThemer::generateItems( KdmItem *paren + if (tagName == "item") { + if (!willDisplay( subnode )) + continue; ++ QString id = el.attribute("id"); ++ if (id.startsWith("plugin-specific-")) { ++ id = id.mid(strlen("plugin-specific-")); ++ if (!_pluginsLogin.contains(id)) ++ continue; ++ } ++ + // It's a new item. Draw it + QString type = el.attribute( "type" ); + +@@ -225,13 +238,11 @@ KdmThemer::generateItems( KdmItem *paren + newItem = new KdmPixmap( parent, subnode ); + else if (type == "rect") + newItem = new KdmRect( parent, subnode ); +- else if (type == "entry") { ++ else if (type == "entry" || type == "list") { + newItem = new KdmRect( parent, subnode ); + newItem->setType( type ); + } + // newItem = new KdmEntry( parent, subnode ); +- //else if (type=="list") +- // newItem = new KdmList( parent, subnode ); + else if (type == "svg") + newItem = new KdmPixmap( parent, subnode ); + if (newItem) { +@@ -287,6 +298,11 @@ bool KdmThemer::willDisplay( const QDomN + #endif + if (type == "halt" || type == "reboot") + return _allowShutdown != SHUT_NONE; ++ else if (type == "userlist") ++ return _userList; ++ else if ( type == "!userlist" ) ++ return !_userList; ++ + // if (type == "system") + // return true; + +@@ -301,7 +317,7 @@ KdmThemer::showStructure( QObject *obj ) + const QObjectList *wlist = obj->children(); + static int counter = 0; + if (counter == 0) +- kdDebug() << "\n\n<======= Widget tree =================" << endl; ++ kdDebug() << timestamp() << " \n\n<======= Widget tree =================" << endl; + if (wlist) { + counter++; + QObjectListIterator it( *wlist ); +@@ -323,7 +339,46 @@ KdmThemer::showStructure( QObject *obj ) + counter--; + } + if (counter == 0) +- kdDebug() << "\n\n<======= Widget tree =================\n\n" << endl; ++ kdDebug() << timestamp() << " \n\n<======= Widget tree =================\n\n" << endl; ++} ++ ++void ++KdmThemer::slotActivated( const QString &id ) ++{ ++ QString toactivate; ++ if (id == "username-label") ++ toactivate = "user-entry"; ++ else if (id == "password-label") ++ toactivate = "pw-entry"; ++ else ++ return; ++ ++ KdmItem *item = findNode(toactivate); ++ if (!item || !item->widget()) ++ return; ++ ++ item->widget()->setFocus(); ++ QLineEdit *le = (QLineEdit*)item->widget()->qt_cast("QLineEdit"); ++ if (le) ++ le->selectAll(); ++} ++ ++void ++KdmThemer::slotPaintRoot() ++{ ++ KdmItem *back_item = findNode("background"); ++ if (!back_item) ++ return; ++ ++ QRect screen = QApplication::desktop()->screenGeometry(0); ++ QPixmap pm(screen.size()); ++ ++ QPainter painter( &pm, true ); ++ back_item->paint( &painter, back_item->rect()); ++ painter.end(); ++ ++ QApplication::desktop()->screen()->setErasePixmap(pm); ++ QApplication::desktop()->screen()->erase(); + } + + #include "kdmthemer.moc" +Index: kdm/kfrontend/themer/kdmthemer.h +=================================================================== +--- kdm/kfrontend/themer/kdmthemer.h.orig ++++ kdm/kfrontend/themer/kdmthemer.h +@@ -80,6 +80,10 @@ public: + signals: + void activated( const QString &id ); + ++protected slots: ++ void slotActivated( const QString &id ); ++ void slotPaintRoot(); ++ + private: + /* + * Our display mode (e.g. console, remote, ...) +Index: kdm/kfrontend/themer/kdmlayout.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmlayout.cpp.orig ++++ kdm/kfrontend/themer/kdmlayout.cpp +@@ -20,6 +20,7 @@ + */ + + #include "kdmlayout.h" ++#include "kdmconfig.h" + #include "kdmitem.h" + + #include <kdebug.h> +@@ -35,11 +36,11 @@ KdmLayoutFixed::KdmLayoutFixed( const QD + void + KdmLayoutFixed::update( const QRect &parentGeometry, bool force ) + { +- kdDebug() << "KdmLayoutFixed::update " << parentGeometry << endl; ++ kdDebug() << timestamp() << " KdmLayoutFixed::update " << parentGeometry << endl; + + // I can't layout children if the parent rectangle is not valid + if (parentGeometry.width() < 0 || parentGeometry.height() < 0) { +- kdDebug() << "invalid\n"; ++ kdDebug() << timestamp() << " invalid\n"; + return; + } + // For each child in list I ask their hinted size and set it! +@@ -102,7 +103,7 @@ KdmLayoutBox::update( const QRect &paren + childrenRect.setTop( childrenRect.top() + height + box.spacing ); + } else { + QRect temp( childrenRect.left(), childrenRect.top(), width, childrenRect.height() ); +- kdDebug() << "placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl; ++ kdDebug() << timestamp() << " placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl; + temp = (*it)->placementHint( temp ); + (*it)->setGeometry( temp, force ); + childrenRect.setLeft( childrenRect.left() + width + box.spacing ); +@@ -125,7 +126,7 @@ KdmLayoutBox::update( const QRect &paren + kdDebug() << this << " placementHint " << *it << " " << temp << " " << itemRect << endl; + temp.setWidth( itemRect.width() ); + childrenRect.setLeft( childrenRect.left() + itemRect.size().width() + box.spacing ); +- kdDebug() << "childrenRect after " << *it << " " << childrenRect << endl; ++ kdDebug() << timestamp() << " childrenRect after " << *it << " " << childrenRect << endl; + } + itemRect = (*it)->placementHint( temp ); + kdDebug() << this << " placementHint2 " << *it << " " << temp << " " << itemRect << endl; +Index: kdm/kfrontend/themer/kdmrect.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmrect.cpp.orig ++++ kdm/kfrontend/themer/kdmrect.cpp +@@ -33,6 +33,18 @@ + KdmRect::KdmRect( KdmItem *parent, const QDomNode &node, const char *name ) + : KdmItem( parent, node, name ) + { ++ init( node, name ); ++} ++ ++KdmRect::KdmRect( QWidget *parent, const QDomNode &node, const char *name ) ++ : KdmItem( parent, node, name ) ++{ ++ init( node, name ); ++} ++ ++void ++KdmRect::init( const QDomNode &node, const char * ) ++{ + itemType = "rect"; + + // Set default values for rect (note: strings are already Null) +@@ -137,13 +149,6 @@ KdmRect::recursiveSetAttribs( QLayoutIte + } + + void +-KdmRect::setWidget( QWidget *widget ) +-{ +- KdmItem::setWidget( widget ); +- setAttribs( widget ); +-} +- +-void + KdmRect::setLayoutItem( QLayoutItem *item ) + { + KdmItem::setLayoutItem( item ); +@@ -151,4 +156,17 @@ KdmRect::setLayoutItem( QLayoutItem *ite + } + */ + ++void ++KdmRect::setWidget( QWidget *widget ) ++{ ++ if ( rect.normal.color.isValid() && widget ) ++ { ++ QPalette p = widget->palette(); ++ p.setColor( QPalette::Normal, QColorGroup::Text, rect.normal.color ); ++ widget->setPalette(p); ++ } ++ KdmItem::setWidget( widget ); ++ //setAttribs( widget ); ++} ++ + #include "kdmrect.moc" +Index: kdm/kfrontend/themer/kdmitem.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmitem.cpp.orig ++++ kdm/kfrontend/themer/kdmitem.cpp +@@ -23,10 +23,11 @@ + * Generic Kdm Item + */ + +-//#define DRAW_OUTLINE 1 // for debugging only ++// #define DRAW_OUTLINE 1 // for debugging only + + #include "kdmitem.h" + #include "kdmlayout.h" ++#include "kdmconfig.h" + + #include <kglobal.h> + #include <kdebug.h> +@@ -35,9 +36,7 @@ + #include <qwidget.h> + #include <qlayout.h> + #include <qimage.h> +-#ifdef DRAW_OUTLINE +-# include <qpainter.h> +-#endif ++#include <qpainter.h> + + KdmItem::KdmItem( KdmItem *parent, const QDomNode &node, const char *name ) + : QObject( parent, name ) +@@ -48,6 +47,25 @@ KdmItem::KdmItem( KdmItem *parent, const + , myLayoutItem( 0 ) + , buttonParent( 0 ) + { ++ init(node, name); ++} ++ ++ ++KdmItem::KdmItem( QWidget *parent, const QDomNode &node, const char *name ) ++ : QObject( parent, name ) ++ , boxManager( 0 ) ++ , fixedManager( 0 ) ++ , image( 0 ) ++ , myWidget( 0 ) ++ , myLayoutItem( 0 ) ++ , buttonParent( 0 ) ++{ ++ init(node, name); ++} ++ ++void ++KdmItem::init( const QDomNode &node, const char * ) ++{ + // Set default layout for every item + currentManager = MNone; + pos.x = pos.y = 0; +@@ -62,7 +80,7 @@ KdmItem::KdmItem( KdmItem *parent, const + state = Snormal; + + // The "toplevel" node (the screen) is really just like a fixed node +- if (!parent || !parent->inherits( "KdmItem" )) { ++ if (!parent() || !parent()->inherits( "KdmItem" )) { + setFixedLayout(); + return; + } +@@ -87,7 +105,7 @@ KdmItem::KdmItem( KdmItem *parent, const + id = tnode.toElement().attribute( "id", QString::number( (ulong)this, 16 ) ); + + // Tell 'parent' to add 'me' to its children +- KdmItem *parentItem = static_cast<KdmItem *>( parent ); ++ KdmItem *parentItem = static_cast<KdmItem *>( parent() ); + parentItem->addChildItem( this ); + } + +@@ -195,7 +213,7 @@ KdmItem::setWidget( QWidget *widget ) + if (frame) + frame->setFrameStyle( QFrame::NoFrame ); + +- myWidget->setGeometry(area); ++ setGeometry(area, true); + + connect( myWidget, SIGNAL(destroyed()), SLOT(widgetGone()) ); + } +@@ -236,15 +254,21 @@ KdmItem::setGeometry( const QRect &newGe + + area = newGeometry; + +- if (myWidget) +- myWidget->setGeometry( newGeometry ); ++ if (myWidget) { ++ QRect widGeo = newGeometry; ++ if ( widGeo.height() > myWidget->maximumHeight() ) { ++ widGeo.moveTop( widGeo.top() + ( widGeo.height() - myWidget->maximumHeight() ) / 2 ); ++ widGeo.setHeight( myWidget->maximumHeight() ); ++ } ++ myWidget->setGeometry( widGeo ); ++ } + if (myLayoutItem) + myLayoutItem->setGeometry( newGeometry ); + + // recurr to all boxed children + if (boxManager && !boxManager->isEmpty()) + boxManager->update( newGeometry, force ); +- ++ + // recurr to all fixed children + if (fixedManager && !fixedManager->isEmpty()) + fixedManager->update( newGeometry, force ); +@@ -258,8 +282,16 @@ KdmItem::paint( QPainter *p, const QRect + if (isHidden()) + return; + +- if (myWidget || (myLayoutItem && myLayoutItem->widget())) +- return; ++ if (myWidget || (myLayoutItem && myLayoutItem->widget())) { ++ // KListView because it's missing a Q_OBJECT ++ if ( myWidget && myWidget->isA( "KListView" ) ) { ++ QPixmap copy( myWidget->size() ); ++ kdDebug() << myWidget->geometry() << " " << area << " " << myWidget->size() << endl; ++ bitBlt( ©, QPoint( 0, 0), p->device(), myWidget->geometry(), Qt::CopyROP ); ++ myWidget->setPaletteBackgroundPixmap( copy ); ++ } ++ return; ++ } + + if (area.intersects( rect )) { + QRect contentsRect = area.intersect( rect ); +@@ -280,6 +312,8 @@ KdmItem::paint( QPainter *p, const QRect + QValueList<KdmItem *>::Iterator it; + for (it = m_children.begin(); it != m_children.end(); ++it) + (*it)->paint( p, rect ); ++ ++ + } + + KdmItem *KdmItem::currentActive = 0; +@@ -287,8 +321,11 @@ KdmItem *KdmItem::currentActive = 0; + void + KdmItem::mouseEvent( int x, int y, bool pressed, bool released ) + { ++ if (isShown == ExplicitlyHidden) ++ return; ++ + if (buttonParent && buttonParent != this) { +- buttonParent->mouseEvent( x, y, pressed, released ); ++ buttonParent->mouseEvent( x, y, pressed, released ); + return; + } + +@@ -362,7 +399,8 @@ KdmItem::placementHint( const QRect &par + w = parentRect.width(), + h = parentRect.height(); + +- kdDebug() << "KdmItem::placementHint parentRect=" << id << parentRect << " hintedSize=" << hintedSize << endl; ++ kdDebug() << timestamp() << " KdmItem::placementHint parentRect=" << parentRect << " hintedSize=" << hintedSize << endl; ++ + // check if width or height are set to "box" + if (pos.wType == DTbox || pos.hType == DTbox) { + if (myLayoutItem || myWidget) +@@ -372,7 +410,7 @@ KdmItem::placementHint( const QRect &par + return parentRect; + boxHint = boxManager->sizeHint(); + } +- kdDebug() << " => boxHint " << boxHint << endl; ++ kdDebug() << timestamp() << " boxHint " << boxHint << endl; + } + + if (pos.xType == DTpixel) +@@ -380,25 +418,25 @@ KdmItem::placementHint( const QRect &par + else if (pos.xType == DTnpixel) + x = parentRect.right() - pos.x; + else if (pos.xType == DTpercent) +- x += int( parentRect.width() / 100.0 * pos.x ); ++ x += qRound( parentRect.width() / 100.0 * pos.x ); + + if (pos.yType == DTpixel) + y += pos.y; + else if (pos.yType == DTnpixel) + y = parentRect.bottom() - pos.y; + else if (pos.yType == DTpercent) +- y += int( parentRect.height() / 100.0 * pos.y ); ++ y += qRound( parentRect.height() / 100.0 * pos.y ); + + if (pos.wType == DTpixel) + w = pos.width; + else if (pos.wType == DTnpixel) + w -= pos.width; + else if (pos.wType == DTpercent) +- w = int( parentRect.width() / 100.0 * pos.width ); ++ w = qRound( parentRect.width() / 100.0 * pos.width ); + else if (pos.wType == DTbox) + w = boxHint.width(); + else if (hintedSize.width() > 0) +- w = hintedSize.width(); ++ w = hintedSize.width(); + else + w = 0; + +@@ -407,14 +445,22 @@ KdmItem::placementHint( const QRect &par + else if (pos.hType == DTnpixel) + h -= pos.height; + else if (pos.hType == DTpercent) +- h = int( parentRect.height() / 100.0 * pos.height ); ++ h = qRound( parentRect.height() / 100.0 * pos.height ); + else if (pos.hType == DTbox) + h = boxHint.height(); +- else if (hintedSize.height() > 0) +- h = hintedSize.height(); +- else ++ else if (hintedSize.height() > 0) { ++ if (w && pos.wType != DTnone) ++ h = (hintedSize.height() * w) / hintedSize.width(); ++ else ++ h = hintedSize.height(); ++ } else + h = 0; + ++ // we choose to take the hinted size, but it's better to listen to the aspect ratio ++ if (pos.wType == DTnone && pos.hType != DTnone && h && w) { ++ w = qRound(float(hintedSize.width() * h) / hintedSize.height()); ++ } ++ + // defaults to center + int dx = -w / 2, dy = -h / 2; + +@@ -430,7 +476,7 @@ KdmItem::placementHint( const QRect &par + dx = -w; + } + // KdmItem *p = static_cast<KdmItem*>( parent() ); +- kdDebug() << "KdmItem::placementHint " << id << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl; ++ kdDebug() << timestamp() << " placementHint " << this << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl; + y += dy; + x += dx; + +@@ -529,4 +575,17 @@ KdmItem::setFixedLayout( const QDomNode + currentManager = MFixed; + } + ++QWidget * ++KdmItem::parentWidget() const ++{ ++ if (myWidget) ++ return myWidget; ++ if (!this->parent()) ++ return 0; ++ ++ if (parent()->qt_cast("QWidget")) ++ return (QWidget*)parent(); ++ return ((KdmItem*)parent())->parentWidget(); ++} ++ + #include "kdmitem.moc" +Index: kdm/kfrontend/themer/kdmpixmap.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmpixmap.cpp.orig ++++ kdm/kfrontend/themer/kdmpixmap.cpp +@@ -22,6 +22,7 @@ + #include <config.h> + + #include "kdmpixmap.h" ++#include <kdmconfig.h> + + #include <kimageeffect.h> + #ifdef HAVE_LIBART +@@ -29,6 +30,7 @@ + #endif + + #include <kdebug.h> ++#include <kstandarddirs.h> + + #include <qpainter.h> + #include <qpixmap.h> +@@ -58,21 +60,28 @@ KdmPixmap::KdmPixmap( KdmItem *parent, c + QString tagName = el.tagName(); + + if (tagName == "normal") { +- loadPixmap( el.attribute( "file", "" ), pixmap.normal.pixmap, pixmap.normal.fullpath ); ++ pixmap.normal.fullpath = fullPath( el.attribute( "file", "" ) ); + parseColor( el.attribute( "tint", "#ffffff" ), pixmap.normal.tint ); + pixmap.normal.alpha = el.attribute( "alpha", "1.0" ).toFloat(); + } else if (tagName == "active") { + pixmap.active.present = true; +- loadPixmap( el.attribute( "file", "" ), pixmap.active.pixmap, pixmap.active.fullpath ); ++ pixmap.active.fullpath = fullPath( el.attribute( "file", "" ) ); + parseColor( el.attribute( "tint", "#ffffff" ), pixmap.active.tint ); + pixmap.active.alpha = el.attribute( "alpha", "1.0" ).toFloat(); + } else if (tagName == "prelight") { + pixmap.prelight.present = true; +- loadPixmap( el.attribute( "file", "" ), pixmap.prelight.pixmap, pixmap.prelight.fullpath ); ++ pixmap.prelight.fullpath = fullPath(el.attribute( "file", "" ) ); + parseColor( el.attribute( "tint", "#ffffff" ), pixmap.prelight.tint ); + pixmap.prelight.alpha = el.attribute( "alpha", "1.0" ).toFloat(); + } + } ++ ++ // look if we have to have the aspect ratio ready ++ if (((pos.wType == DTnone && pos.hType != DTnone) || ++ (pos.wType != DTnone && pos.hType == DTnone) || ++ (pos.wType == DTnone && pos.hType == DTnone)) && ++ !pixmap.normal.fullpath.endsWith( ".svg" )) ++ loadPixmap( &pixmap.normal ); + } + + QSize +@@ -100,19 +109,16 @@ KdmPixmap::setGeometry( const QRect &new + } + + +-void +-KdmPixmap::loadPixmap( const QString &fileName, QPixmap &map, QString &fullName ) ++QString ++KdmPixmap::fullPath( const QString &fileName) + { +- if (fileName.isEmpty()) +- return; ++ if (fileName.isEmpty()) ++ return QString::null; + +- fullName = fileName; ++ QString fullName = fileName; + if (fullName.at( 0 ) != '/') + fullName = baseDir() + "/" + fileName; +- +- if (!fullName.endsWith( ".svg" )) // we delay it for svgs +- if (!map.load( fullName )) +- fullName = QString::null; ++ return fullName; + } + + void +@@ -140,6 +146,25 @@ KdmPixmap::renderSvg( PixmapStruct::Pixm + } + + void ++KdmPixmap::loadPixmap( PixmapStruct::PixmapClass *pClass ) ++{ ++ QString fullpath = pClass->fullpath; ++ ++ kdDebug() << timestamp() << " load " << fullpath << endl; ++ int index = fullpath.findRev('.'); ++ QString ext = fullpath.right(fullpath.length() - index); ++ fullpath = fullpath.left(index); ++ kdDebug() << timestamp() << " ext " << ext << " " << fullpath << endl; ++ QString testpath = QString("-%1x%2").arg(area.width()).arg(area.height()) + ext; ++ kdDebug() << timestamp() << " testing for " << fullpath + testpath << endl; ++ if (KStandardDirs::exists(fullpath + testpath)) ++ pClass->pixmap.load(fullpath + testpath); ++ else ++ pClass->pixmap.load( fullpath + ext ); ++ kdDebug() << timestamp() << " done\n"; ++} ++ ++void + KdmPixmap::drawContents( QPainter *p, const QRect &r ) + { + // choose the correct pixmap class +@@ -149,12 +174,20 @@ KdmPixmap::drawContents( QPainter *p, co + if (state == Sprelight && pixmap.prelight.present) + pClass = &pixmap.prelight; + ++ kdDebug() << "draw " << id << " " << pClass->pixmap.isNull() << endl; ++ + if (pClass->pixmap.isNull()) { +- if (pClass->fullpath.isEmpty()) // if neither is set, we're empty ++ ++ if (pClass->fullpath.isEmpty()) // if neither is set, we're empty + return; +- +- kdDebug() << "renderSVG\n"; +- renderSvg( pClass, area ); ++ ++ if (!pClass->fullpath.endsWith( ".svg" ) ) { ++ loadPixmap(pClass); ++ } else { ++ kdDebug() << timestamp() << " renderSVG\n"; ++ renderSvg( pClass, area ); ++ kdDebug() << timestamp() << " done\n"; ++ } + } + + int px = area.left() + r.left(); +@@ -176,25 +209,37 @@ KdmPixmap::drawContents( QPainter *p, co + + + if (pClass->readyPixmap.isNull()) { +- QImage scaledImage; ++ ++ bool haveTint = pClass->tint.rgb() != 0xFFFFFF; ++ bool haveAlpha = pClass->alpha < 1.0; + ++ QImage scaledImage; ++ + // use the loaded pixmap or a scaled version if needed + ++ kdDebug() << timestamp() << " prepare readyPixmap " << pClass->fullpath << " " << area.size() << " " << pClass->pixmap.size() << endl; + if (area.size() != pClass->pixmap.size()) { + if (pClass->fullpath.endsWith( ".svg" )) { +- kdDebug() << "renderSVG\n"; ++ kdDebug() << timestamp() << " renderSVG\n"; + renderSvg( pClass, area ); + scaledImage = pClass->pixmap.convertToImage(); + } else { +- kdDebug() << "convertFromImage\n"; ++ kdDebug() << timestamp() << " convertFromImage smoothscale\n"; + QImage tempImage = pClass->pixmap.convertToImage(); ++ kdDebug() << timestamp() << " convertToImage done\n"; + scaledImage = tempImage.smoothScale( area.width(), area.height() ); ++ kdDebug() << timestamp() << " done\n"; + } +- } else ++ } else { ++ if (haveTint || haveAlpha) ++ { + scaledImage = pClass->pixmap.convertToImage(); +- +- bool haveTint = pClass->tint.rgb() != 0xFFFFFF; +- bool haveAlpha = pClass->alpha < 1.0; ++ // enforce rgba values for the later ++ scaledImage = scaledImage.convertDepth( 32 ); ++ } ++ else ++ pClass->readyPixmap = pClass->pixmap; ++ } + + if (haveTint || haveAlpha) { + // blend image(pix) with the given tint +@@ -221,9 +266,12 @@ KdmPixmap::drawContents( QPainter *p, co + + } + +- pClass->readyPixmap.convertFromImage( scaledImage ); ++ if (!scaledImage.isNull()) { ++ kdDebug() << timestamp() << " convertFromImage " << id << " " << area << endl; ++ pClass->readyPixmap.convertFromImage( scaledImage ); ++ } + } +- // kdDebug() << "Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl; ++ kdDebug() << timestamp() << " Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl; + p->drawPixmap( px, py, pClass->readyPixmap, sx, sy, sw, sh ); + } + +Index: kdm/kfrontend/themer/kdmlabel.cpp +=================================================================== +--- kdm/kfrontend/themer/kdmlabel.cpp.orig ++++ kdm/kfrontend/themer/kdmlabel.cpp +@@ -19,8 +19,10 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + ++#include <config.h> + #include "kdmlabel.h" +-#include <kgreeter.h> ++#include "kdmconfig.h" ++#include "../kgreeter.h" + + #include <kglobal.h> + #include <klocale.h> +@@ -31,6 +33,7 @@ + #include <qpainter.h> + #include <qfontmetrics.h> + #include <qtimer.h> ++#include <qaccel.h> + + #include <unistd.h> + #include <sys/utsname.h> +@@ -39,7 +42,7 @@ + #endif + + KdmLabel::KdmLabel( KdmItem *parent, const QDomNode &node, const char *name ) +- : KdmItem( parent, node, name ) ++ : KdmItem( parent, node, name ), myAccel(0) + { + itemType = "label"; + +@@ -92,21 +95,46 @@ KdmLabel::KdmLabel( KdmItem *parent, con + } + } + +- // Check if this is a timer label ++ // Check if this is a timer label) + label.isTimer = label.text.find( "%c" ) >= 0; + if (label.isTimer) { + timer = new QTimer( this ); + timer->start( 1000 ); + connect( timer, SIGNAL(timeout()), SLOT(update()) ); + } +- cText = lookupText( label.text ); ++ setTextInt( lookupText( label.text ) ); ++} ++ ++void ++KdmLabel::setTextInt( const QString &txt) ++{ ++ // TODO: catch && ++ cText = txt; ++ cAccel = txt.find('&'); ++ delete myAccel; ++ myAccel = 0; ++ if (cAccel != -1) { ++ cText.remove('&'); ++ myAccel = new QAccel(parentWidget()); ++ myAccel->insertItem(ALT + UNICODE_ACCEL + cText.at(cAccel).lower().unicode()); ++ connect(myAccel, SIGNAL(activated(int)), SLOT(slotAccel())); ++ } ++} ++ ++void ++KdmLabel::slotAccel() ++{ ++ if (buttonParent) ++ emit activated(buttonParent->getId()); ++ else ++ emit activated(id); + } + + void + KdmLabel::setText( const QString &txt ) + { + label.text = txt; +- update(); ++ setTextInt( lookupText( label.text ) ); + } + + QSize +@@ -139,7 +167,23 @@ KdmLabel::drawContents( QPainter *p, con + p->setFont( l->font ); + p->setPen( l->color ); + //TODO paint clipped (tested but not working..) +- p->drawText( area, AlignLeft | SingleLine, cText ); ++ if (cAccel != -1 && (!id.isEmpty() || buttonParent) ) { ++ QString left = cText.left(cAccel); ++ QString right = cText.mid(cAccel + 1); ++ p->drawText( area, AlignLeft | SingleLine, left ); ++ QRect tarea = area; ++ QFontMetrics fm(l->font); ++ tarea.rLeft() += fm.width(left); ++ QFont f(l->font); ++ f.setUnderline(true); ++ p->setFont ( f ); ++ p->drawText( tarea, AlignLeft | SingleLine, QString(cText.at(cAccel))); ++ tarea.rLeft() += fm.width(cText.at(cAccel)); ++ p->setFont( l->font ); ++ p->drawText( tarea, AlignLeft | SingleLine, right); ++ } else { ++ p->drawText( area, AlignLeft | SingleLine, cText); ++ } + } + + void +@@ -159,7 +203,7 @@ KdmLabel::update() + { + QString text = lookupText( label.text ); + if (text != cText) { +- cText = text; ++ setTextInt(text); + needUpdate(); + } + } +@@ -167,22 +211,23 @@ KdmLabel::update() + static const struct { + const char *type, *text; + } stocks[] = { +- { "language", I18N_NOOP("Language") }, +- { "session", I18N_NOOP("Session Type") }, +- { "system", I18N_NOOP("Menu") }, // i18n("Actions"); +- { "disconnect", I18N_NOOP("Disconnect") }, +- { "quit", I18N_NOOP("Quit") }, +- { "halt", I18N_NOOP("Power off") }, +- { "suspend", I18N_NOOP("Suspend") }, +- { "reboot", I18N_NOOP("Reboot") }, ++ { "language", I18N_NOOP("&Language") }, ++ { "session", I18N_NOOP("Session &Type") }, ++ { "system", I18N_NOOP("&System") }, // i18n("Actions"); ++ { "disconnect", I18N_NOOP("&Disconnect") }, ++ { "quit", I18N_NOOP("&Quit") }, ++ { "halt", I18N_NOOP("Power O&ff") }, ++ { "suspend", I18N_NOOP("S&uspend") }, ++ { "reboot", I18N_NOOP("&Reboot") }, + { "chooser", I18N_NOOP("XDMCP Chooser") }, + { "config", I18N_NOOP("Configure") }, +- { "caps-lock-warning", I18N_NOOP("You have got caps lock on.") }, +- { "timed-label", I18N_NOOP("User %s will login in %d seconds") }, +- { "welcome-label", I18N_NOOP("Welcome to %h") }, // _greetString +- { "username-label", I18N_NOOP("Username:") }, +- { "password-label", I18N_NOOP("Password:") }, +- { "login", I18N_NOOP("Login") } ++ { "caps-lock-warning", I18N_NOOP("Caps Lock is enabled.") }, ++ { "timed-label", I18N_NOOP("User %s will log in in %d seconds") }, ++ { "welcome-label", I18N_NOOP("Welcome to %h") }, // _greetString ++ { "username-label", I18N_NOOP("&Username:") }, ++ { "password-label", I18N_NOOP("&Password:") }, ++ { "domain-label", I18N_NOOP("&Domain:") }, ++ { "login", I18N_NOOP("L&ogin") } + }; + + QString +@@ -195,7 +240,7 @@ KdmLabel::lookupStock( const QString &st + if (type == stocks[i].type) + return i18n(stocks[i].text); + +- kdDebug() << "Invalid <stock> element. Check your theme!" << endl; ++ kdDebug() << timestamp() << " Invalid <stock> element. Check your theme!" << endl; + return stock; + } + +@@ -205,7 +250,6 @@ KdmLabel::lookupText( const QString &t ) + QString text = t; + + text.replace( '_', '&' ); +-// text.remove( '_' ); // FIXME add key accels, remove underscores for now + + QMap<QChar,QString> m; + struct utsname uts; +Index: kdm/kfrontend/kdmconfig.h +=================================================================== +--- kdm/kfrontend/kdmconfig.h.orig ++++ kdm/kfrontend/kdmconfig.h +@@ -35,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <qstring.h> + #include <qstringlist.h> + #include <qfont.h> ++#include <sys/time.h> + + extern QString _stsFile; + extern bool _isLocal; +@@ -46,6 +47,19 @@ CONF_GREET_CPP_DECLS + struct dpySpec; + void decodeSess( dpySpec *sess, QString &user, QString &loc ); + ++extern struct timeval st; ++ ++inline QString timestamp() { ++ struct timeval nst; ++ gettimeofday(&nst, 0); ++ if (!st.tv_sec) ++ gettimeofday(&st, 0); ++ ++ QString ret; ++ ret.sprintf("[%07ld]", (nst.tv_sec - st.tv_sec) * 1000 + (nst.tv_usec - st.tv_usec) / 1000); ++ return ret; ++} ++ + extern "C" + #endif + void init_config( void ); +Index: kdm/kfrontend/kgreeter.h +=================================================================== +--- kdm/kfrontend/kgreeter.h.orig ++++ kdm/kfrontend/kgreeter.h +@@ -73,9 +73,10 @@ class KGreeter : public KGDialog, public + void slotUserEntered(); + + protected: ++ void readFacesList(); + void installUserList(); + void insertUser( const QImage &, const QString &, struct passwd * ); +- void insertUsers(); ++ void insertUsers( int limit = -1); + void putSession( const QString &, const QString &, bool, const char * ); + void insertSessions(); + virtual void pluginSetup(); +@@ -87,10 +88,13 @@ class KGreeter : public KGDialog, public + QStringList *userList; + QPopupMenu *sessMenu; + QValueVector<SessType> sessionTypes; ++ QStringList randomFaces; ++ QMap<QString, QString> randomFacesMap; + int nNormals, nSpecials; + int curPrev, curSel; + bool prevValid; + bool needLoad; ++ bool themed; + + static int curPlugin; + static PluginList pluginList; +Index: kdm/kfrontend/kgdialog.cpp +=================================================================== +--- kdm/kfrontend/kgdialog.cpp.orig ++++ kdm/kfrontend/kgdialog.cpp +@@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include "kdm_greet.h" + + #include <klocale.h> ++#include <kiconloader.h> + + #include <qaccel.h> + #include <qlayout.h> +@@ -58,7 +59,7 @@ KGDialog::completeMenu() + #ifdef HAVE_VTS + if (_isLocal) { + dpyMenu = new QPopupMenu( this ); +- int id = inserten( i18n("Sw&itch User"), ALT+Key_I, dpyMenu ); ++ int id = inserten( i18n("Sw&itch User"), CTRL + Key_I, dpyMenu ); + connect( dpyMenu, SIGNAL(activated( int )), + SLOT(slotDisplaySelected( int )) ); + connect( dpyMenu, SIGNAL(aboutToShow()), +@@ -71,7 +72,7 @@ KGDialog::completeMenu() + + if (_allowClose) + inserten( _isLocal ? i18n("R&estart X Server") : i18n("Clos&e Connection"), +- ALT+Key_E, SLOT(slotExit()) ); ++ 0, SLOT(slotExit()) ); + + #ifdef XDMCP + if (_isLocal && _loginMode != _switchIf) { +@@ -81,10 +82,11 @@ KGDialog::completeMenu() + #endif + + if (_hasConsole) +- inserten( i18n("Co&nsole Login"), ALT+Key_N, SLOT(slotConsole()) ); ++ inserten( i18n("Co&nsole Login"), CTRL+Key_N, SLOT(slotConsole()) ); + + if (_allowShutdown != SHUT_NONE) { +- inserten( i18n("&Shutdown..."), ALT+Key_S, SLOT(slotShutdown( int )) ); ++ ensureMenu(); ++ optMenu->insertItem(SmallIconSet( "exit" ), i18n("&Shutdown..."), this, SLOT(slotShutdown(int)), CTRL+Key_S ); + QAccel *accel = new QAccel( this ); + accel->insertItem( ALT+CTRL+Key_Delete ); + connect( accel, SIGNAL(activated( int )), SLOT(slotShutdown( int )) ); +Index: kdm/kfrontend/kdmconfig.cpp +=================================================================== +--- kdm/kfrontend/kdmconfig.cpp.orig ++++ kdm/kfrontend/kdmconfig.cpp +@@ -33,6 +33,8 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <unistd.h> + #include <sys/utsname.h> + ++struct timeval st = {0, 0}; ++ + CONF_GREET_DEFS + + QString _stsFile; +Index: kdm/kfrontend/kgapp.cpp +=================================================================== +--- kdm/kfrontend/kgapp.cpp.orig ++++ kdm/kfrontend/kgapp.cpp +@@ -36,6 +36,8 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <kcrash.h> + #include <kstandarddirs.h> + #include <ksimpleconfig.h> ++#include <klocale.h> ++#include <kdebug.h> + + #include <qtimer.h> + #include <qcursor.h> +@@ -130,6 +132,7 @@ kg_main( const char *argv0 ) + static char *argv[] = { (char *)"kdmgreet", 0 }; + KCmdLineArgs::init( 1, argv, *argv, 0, 0, 0, true ); + ++ kdDebug() << timestamp() << "start" << endl; + kde_have_kipc = false; + KApplication::disableAutoDcopRegistration(); + KCrash::setSafer( true ); +@@ -166,6 +169,7 @@ kg_main( const char *argv0 ) + + GSendInt( G_Ready ); + ++ kdDebug() << timestamp() << " main1" << endl; + setCursor( dpy, app.desktop()->winId(), XC_left_ptr ); + + for (;;) { +@@ -206,6 +210,7 @@ kg_main( const char *argv0 ) + if (_useTheme && !_theme.isEmpty()) { + KThemedGreeter *tgrt; + dialog = tgrt = new KThemedGreeter; ++ kdDebug() << timestamp() << " themed" << endl; + if (!tgrt->isOK()) { + delete tgrt; + dialog = new KStdGreeter; +Index: kdm/kfrontend/kgreeter.cpp +=================================================================== +--- kdm/kfrontend/kgreeter.cpp.orig ++++ kdm/kfrontend/kgreeter.cpp +@@ -38,6 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <klistview.h> + #include <ksimpleconfig.h> + #include <kstringhandler.h> ++#include <kdebug.h> + + #undef Unsorted // x headers suck - make qdir.h work with --enable-final + #include <qdir.h> +@@ -46,6 +47,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <qmemarray.h> + #include <qimage.h> + #include <qmovie.h> ++#include <qpainter.h> + #include <qpopupmenu.h> + #include <qtimer.h> + #include <qheader.h> +@@ -63,27 +65,46 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <unistd.h> + #include <fcntl.h> + #include <sys/types.h> ++#include <utmp.h> ++#include <utmpx.h> + + #include <X11/Xlib.h> + + class UserListView : public KListView { + public: +- UserListView( QWidget *parent = 0, const char *name = 0 ) ++ UserListView( bool _them, QWidget *parent = 0, const char *name = 0 ) + : KListView( parent, name ) +- , cachedSizeHint( -1, 0 ) ++ , themed(_them), cachedSizeHint( -1, 0 ) + { + setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Ignored ); + header()->hide(); + addColumn( QString::null ); + setColumnAlignment( 0, AlignVCenter ); + setResizeMode( QListView::LastColumn ); ++ if (themed) { ++ setBackgroundMode( Qt::NoBackground ); ++ viewport()->setBackgroundMode( Qt::NoBackground ); ++ setFrameStyle( QFrame::NoFrame ); ++ } + } + ++ bool themed; + mutable QSize cachedSizeHint; + +- protected: ++ int sumHeight() const ++ { ++ int sum = 0; ++ for (QListViewItem *itm = firstChild(); itm; itm = itm->nextSibling()) { ++ sum += itm->height(); ++ } ++ return sum; ++ } ++public: + virtual QSize sizeHint() const + { ++ if (themed) ++ return KListView::sizeHint(); ++ + if (!cachedSizeHint.isValid()) { + constPolish(); + uint maxw = 0; +@@ -98,8 +119,23 @@ class UserListView : public KListView { + } + return cachedSizeHint; + } +-}; ++ virtual void paintEmptyArea ( QPainter * p, const QRect & rect ) ++ { ++ if (!themed) ++ return KListView::paintEmptyArea(p, rect ); ++ ++ const QPixmap *pm = paletteBackgroundPixmap(); ++ if (!pm || pm->isNull()) ++ return; ++ ++ kdDebug() << "paintEmpty " << rect << endl; ++ QRect devRect = p->xForm( rect ); ++ kdDebug() << "paintEmpty2 " << devRect << endl; ++ p->drawPixmap(0, 0, *pm, devRect.left(), devRect.top() ); ++ } + ++ QPixmap background; ++}; + + int KGreeter::curPlugin = -1; + PluginList KGreeter::pluginList; +@@ -115,12 +151,14 @@ KGreeter::KGreeter( bool framed ) + , curSel( -1 ) + , prevValid( true ) + , needLoad( false ) ++ , themed( framed ) + { + stsFile = new KSimpleConfig( _stsFile ); + stsFile->setGroup( "PrevUser" ); + + if (_userList) { +- userView = new UserListView( this ); ++ readFacesList(); ++ userView = new UserListView( framed, this ); + connect( userView, SIGNAL(clicked( QListViewItem * )), + SLOT(slotUserClicked( QListViewItem * )) ); + connect( userView, SIGNAL(doubleClicked( QListViewItem * )), +@@ -128,10 +166,8 @@ KGreeter::KGreeter( bool framed ) + } + if (_userCompletion) + userList = new QStringList; +- if (userView || userList) +- insertUsers(); + +- sessMenu = new QPopupMenu( this ); ++ sessMenu = new QPopupMenu( this ); + connect( sessMenu, SIGNAL(activated( int )), + SLOT(slotSessionSelected( int )) ); + insertSessions(); +@@ -150,6 +186,33 @@ KGreeter::~KGreeter() + delete stsFile; + } + ++void KGreeter::readFacesList() ++{ ++ FILE *f = fopen( QFile::encodeName( _faceDir + "/.randomlist" ), "rt" ); ++ if ( !f ) ++ return; ++ QTextIStream is( f ); ++ while ( !is.eof() ) ++ { ++ QString line = is.readLine().simplifyWhiteSpace(); ++ if ( line.isEmpty() ) ++ continue; ++ QString icon; ++ int index = line.find( ' ' ); ++ if ( index > 0 ) { ++ icon = line.left( index ); ++ line = line.mid( index ); ++ } else { ++ icon = line; ++ line = QString::null; ++ } ++ randomFaces.push_back( icon ); ++ QStringList list = QStringList::split( ' ', line ); ++ for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) ++ randomFacesMap[*it] = icon; ++ } ++} ++ + class UserListViewItem : public KListViewItem { + public: + UserListViewItem( UserListView *parent, const QString &text, +@@ -163,6 +226,14 @@ class UserListViewItem : public KListVie + parent->cachedSizeHint.setWidth( -1 ); + } + ++ virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) ++ { ++ if (((UserListView*)listView())->themed) ++ QListViewItem::paintCell(p, cg, column, width, alignment); ++ else ++ KListViewItem::paintCell(p, cg, column, width, alignment); ++ } ++ + QString login; + }; + +@@ -224,10 +295,23 @@ KGreeter::insertUser( const QImage &defa + QSize ns( 48, 48 ); + if (p.size() != ns) + p = p.convertDepth( 32 ).smoothScale( ns, QImage::ScaleMin ); +- goto gotit; ++ break; + } while (--nd >= 0); +- p = default_pix; +- gotit: ++ ++ if ( p.isNull() && randomFaces.count() ) { ++ QString randomFace = randomFacesMap[username]; ++ if ( randomFace.isNull() ) { ++ QStringList::size_type index = 0; ++ for ( size_t i = 0; i < username.length(); ++i ) ++ index += ( 0x7f - username.at( i ).latin1() ) % 37; ++ randomFace = randomFaces[ index % randomFaces.count() ]; ++ } ++ p.load( _faceDir + "/../pics/users/" + randomFace + ".png" ); ++ } ++ ++ if ( p.isNull() ) ++ p = default_pix; ++ + QString realname = KStringHandler::from8Bit( ps->pw_gecos ); + realname.truncate( realname.find( ',' ) ); + if (realname.isEmpty() || realname == username) +@@ -278,7 +362,7 @@ UserList::UserList( char **in ) + } + + void +-KGreeter::insertUsers() ++KGreeter::insertUsers(int limit_users) + { + struct passwd *ps; + +@@ -305,6 +389,8 @@ KGreeter::insertUsers() + if (_showUsers == SHOW_ALL) { + UserList noUsers( _noUsers ); + QDict<int> dupes( 1000 ); ++ QStringList toinsert; ++ int count = 0; + for (setpwent(); (ps = getpwent()) != 0;) { + if (*ps->pw_dir && *ps->pw_shell && + (ps->pw_uid >= (unsigned)_lowUserId || +@@ -316,10 +402,53 @@ KGreeter::insertUsers() + QString username( QFile::decodeName( ps->pw_name ) ); + if (!dupes.find( username )) { + dupes.insert( username, (int *)-1 ); +- insertUser( default_pix, username, ps ); ++ toinsert.append( username ); ++ ++ if ( limit_users >= 0 && ++count > limit_users ) ++ break; + } + } + } ++ if ( limit_users >= 0 && ++count > limit_users ) { ++ utmpname( _PATH_WTMP ); ++ setutxent(); ++ toinsert = QStringList(); ++ dupes.clear(); ++ ++ for ( count = 0; count < limit_users; ) { ++ struct utmpx * ent = getutxent(); ++ if ( !ent ) ++ break; ++ struct passwd *ps = getpwnam( ent->ut_user ); ++ if (ps && *ps->pw_dir && *ps->pw_shell && ++ (ps->pw_uid >= (unsigned)_lowUserId || ++ !ps->pw_uid && _showRoot) && ++ ps->pw_uid <= (unsigned)_highUserId && ++ !noUsers.hasUser( ps->pw_name ) && ++ !noUsers.hasGroup( ps->pw_gid )) ++ { ++ QString username( QFile::decodeName( ent->ut_user ) ); ++ if (!dupes.find( username )) { ++ dupes.insert( username, (int *)-1 ); ++ toinsert.append( username ); ++ count++; ++ } ++ } ++ ++ ++ } ++ endutxent(); ++ } ++ ++ for ( QStringList::ConstIterator it = toinsert.begin(); ++ it != toinsert.end(); ++it ) ++ { ++ // pretty stupid to do another lookup round, but the number is limited ++ // and caching struct passwd is pretty ugly ++ struct passwd *ps = getpwnam( QFile::encodeName( *it ) ); ++ if ( ps ) ++ insertUser( default_pix, *it, ps ); ++ } + } else { + UserList users( _users ); + if (users.hasGroups()) { +@@ -721,21 +850,24 @@ KStdGreeter::KStdGreeter() + hbox2->addStretch( 1 ); + + if (sessMenu->count() > 1) { +- inserten( i18n("Session &Type"), ALT+Key_T, sessMenu ); ++ inserten( i18n("Session &Type"), 0, sessMenu ); + needSep = true; + } + + if (plugMenu) { +- inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu ); ++ inserten( i18n("&Authentication Method"), 0, plugMenu ); + needSep = true; + } + + #ifdef XDMCP +- completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), ALT+Key_R ); ++ completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), 0 ); + #else + completeMenu(); + #endif + ++ if (userView || userList) ++ insertUsers(); ++ + if (optMenu) + menuButton->setPopup( optMenu ); + else +@@ -829,6 +961,9 @@ KThemedGreeter::KThemedGreeter() + if (xauth_warning && (_authorized || !_authComplain)) + xauth_warning->hide( true ); + ++ if (userView || userList) ++ insertUsers( 7 ); // TODO: find out how many are a good value ++ + // if (!_greetString.isEmpty()) { + // } + // clock = new KdmClock( this, "clock" ); +@@ -854,37 +989,31 @@ KThemedGreeter::KThemedGreeter() + if ((itm = themer->findNode( "session_button" ))) { + if (sessMenu->count() <= 1) + itm->hide( true ); +- else { +- session_button = itm; +- QAccel *accel = new QAccel( this ); +- accel->insertItem( ALT+Key_T, 0 ); +- connect( accel, SIGNAL(activated( int )), SLOT(slotSessMenu()) ); +- } ++ else ++ session_button = itm; + } else { + if (sessMenu->count() > 1) { +- inserten( i18n("Session &Type"), ALT+Key_T, sessMenu ); ++ inserten( i18n("Session &Type"), 0, sessMenu ); + needSep = true; + } + } + + if (plugMenu) { +- inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu ); ++ inserten( i18n("&Authentication Method"), 0, plugMenu ); + needSep = true; + } + + #ifdef XDMCP +- completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), ALT+Key_R ); ++ completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), 0 ); + #else + completeMenu(); + #endif + + system_button = themer->findNode( "system_button" ); +- QAccel *accel = new QAccel( this ); +- accel->insertItem( ALT+Key_M, 0 ); +- connect( accel, SIGNAL(activated( int )), SLOT(slotActionMenu()) ); + + pluginSetup(); + ++ + verify->start(); + } + +@@ -902,8 +1031,8 @@ KThemedGreeter::pluginSetup() + inherited::pluginSetup(); + + if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_rect) { ++ userView->setMaximumHeight( userView->sumHeight() ); + userlist_rect->setWidget( userView ); +- userView->show(); + } else { + if (userView) + userView->hide(); +@@ -919,12 +1048,17 @@ KThemedGreeter::verifyFailed() + { + // goButton->setEnabled( false ); + inherited::verifyFailed(); ++ if (userView) ++ userView->setEnabled(false); + } + + void + KThemedGreeter::verifyRetry() + { + // goButton->setEnabled( true ); ++ if (userView) ++ userView->setEnabled(true); ++ + } + + QString KThemedGreeter::timedUser = QString::null; diff --git a/opensuse/core/tdebase/kdm-mark_autologin.diff b/opensuse/core/tdebase/kdm-mark_autologin.diff new file mode 100644 index 000000000..a913f5a94 --- /dev/null +++ b/opensuse/core/tdebase/kdm-mark_autologin.diff @@ -0,0 +1,13 @@ +Index: kdm/backend/client.c +=================================================================== +--- kdm/backend/client.c.orig ++++ kdm/backend/client.c +@@ -1214,6 +1214,8 @@ StartClient() + env = setEnv( env, "PATH", curuid ? td->userPath : td->systemPath ); + env = setEnv( env, "SHELL", p->pw_shell ); + env = setEnv( env, "HOME", p->pw_dir ); ++ if (cursource == PWSRC_AUTOLOGIN) ++ env = setEnv (env, "KDM_AUTOLOGIN", curuser); + #if !defined(USE_PAM) && !defined(_AIX) && defined(KERBEROS) + if (krbtkfile[0] != '\0') + env = setEnv( env, "KRBTKFILE", krbtkfile ); diff --git a/opensuse/core/tdebase/kdm-pam-np-legacy b/opensuse/core/tdebase/kdm-pam-np-legacy new file mode 100644 index 000000000..5d139e0bb --- /dev/null +++ b/opensuse/core/tdebase/kdm-pam-np-legacy @@ -0,0 +1,7 @@ +#%PAM-1.0 +auth required pam_permit.so +account include common-account +password include common-password +session include common-session +session required pam_devperm.so +session required pam_resmgr.so diff --git a/opensuse/core/tdebase/kdm-relaxed-auth.diff b/opensuse/core/tdebase/kdm-relaxed-auth.diff new file mode 100644 index 000000000..c94fa2b5d --- /dev/null +++ b/opensuse/core/tdebase/kdm-relaxed-auth.diff @@ -0,0 +1,22 @@ +Index: kdm/backend/auth.c +=================================================================== +--- kdm/backend/auth.c.orig ++++ kdm/backend/auth.c +@@ -518,6 +518,7 @@ DefineLocal( FILE *file, Xauth *auth, in + uname( &name ); + writeAddr( FamilyLocal, strlen( name.nodename ), name.nodename, + file, auth, ok ); ++ setenv("XAUTHLOCALHOSTNAME", name.nodename, 1); + #endif + + #if !defined(NEED_UTSNAME) || defined(__hpux) +@@ -1211,6 +1212,9 @@ SetUserAuthorization( struct display *d + userEnviron = setEnv( userEnviron, "XAUTHORITY", envname ); + systemEnviron = setEnv( systemEnviron, "XAUTHORITY", envname ); + } ++ name = getenv("XAUTHLOCALHOSTNAME"); ++ if (name) ++ userEnviron = setEnv( userEnviron, "XAUTHLOCALHOSTNAME", name); + /* a chown() used to be here, but this code runs as user anyway */ + } + Debug( "done SetUserAuthorization\n" ); diff --git a/opensuse/core/tdebase/kdm-suspend-hal.diff b/opensuse/core/tdebase/kdm-suspend-hal.diff new file mode 100644 index 000000000..711e1c114 --- /dev/null +++ b/opensuse/core/tdebase/kdm-suspend-hal.diff @@ -0,0 +1,331 @@ +Index: kdm/backend/ctrl.c +=================================================================== +--- kdm/backend/ctrl.c.orig ++++ kdm/backend/ctrl.c +@@ -483,6 +483,10 @@ processCtrl( const char *string, int len + Reply( "nuke\t" ); + } + } ++ if (d->allowSuspend != SHUT_NONE) { ++ Reply( "suspend\t" ); ++ } ++ + if ((d->displayType & d_location) == dLocal && + AnyReserveDisplays()) + Writer( fd, cbuf, sprintf( cbuf, "reserve %d\t", +Index: kdm/backend/greet.h +=================================================================== +--- kdm/backend/greet.h.orig ++++ kdm/backend/greet.h +@@ -125,6 +125,7 @@ from the copyright holder. + # define SHUT_REBOOT 1 /* how */ + # define SHUT_HALT 2 + # define SHUT_CONSOLE -1 /* pseudo-code */ ++# define SHUT_SUSPEND -2 /* pseudo-code */ + # define SHUT_SCHEDULE 0 /* when; config only */ + # define SHUT_TRYNOW 1 + # define SHUT_FORCENOW 2 +Index: kdm/config.def +=================================================================== +--- kdm/config.def.orig ++++ kdm/config.def +@@ -1799,6 +1799,19 @@ Description: + Who is allowed to shut down the system. This applies both to the + greeter and to the command <acronym>FiFo</acronym>. + ++Key: AllowSuspend ++Type: enum ++ None/SHUT_NONE: no <guilabel>Suspend...</guilabel> menu entry is shown at all ++ Root/SHUT_ROOT: the <systemitem class="username">root</systemitem> password must be entered to suspend ++ All/SHUT_ALL: everybody can suspend the machine ++Default: Root ++User: greeter ++User: core ++Instance: #:0/All ++Comment: & ++Description: ++ If the user should have an option to suspend the system if configured to (also in the desktop) ++ + Key: AllowSdForceNow + Type: enum + None: no forced shutdown is allowed at all +Index: kdm/kfrontend/kdmshutdown.cpp +=================================================================== +--- kdm/kfrontend/kdmshutdown.cpp.orig ++++ kdm/kfrontend/kdmshutdown.cpp +@@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fi + + */ + ++#include <liblazy.h> + #include "kdmshutdown.h" + #include "kdm_greet.h" + +@@ -34,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <kdialog.h> + #include <kstandarddirs.h> + #include <kuser.h> ++#include <kdebug.h> + + #include <qcombobox.h> + #include <qvbuttongroup.h> +@@ -57,6 +59,10 @@ Foundation, Inc., 51 Franklin Street, Fi + int KDMShutdownBase::curPlugin = -1; + PluginList KDMShutdownBase::pluginList; + ++#define DBUS_HAL_INTERFACE "org.freedesktop.Hal" ++#define DBUS_HAL_SYSTEM_POWER_INTERFACE "org.freedesktop.Hal.Device.SystemPowerManagement" ++#define HAL_UDI_COMPUTER "/org/freedesktop/Hal/devices/computer" ++ + KDMShutdownBase::KDMShutdownBase( int _uid, QWidget *_parent ) + : inherited( _parent ) + , box( new QVBoxLayout( this, KDmh, KDsh ) ) +@@ -71,6 +77,7 @@ KDMShutdownBase::KDMShutdownBase( int _u + , verify( 0 ) + , needRoot( -1 ) + , uid( _uid ) ++ , willSuspend( false ) + { + } + +@@ -87,6 +94,7 @@ KDMShutdownBase::complete( QWidget *prev + + if (uid && + ((willShut && _allowShutdown == SHUT_ROOT) || ++ ( willSuspend && _allowSuspend == SHUT_ROOT ) || + (mayNuke && _allowNuke == SHUT_ROOT))) + { + rootlab = new QLabel( i18n("Root authorization required."), this ); +@@ -169,6 +177,7 @@ KDMShutdownBase::updateNeedRoot() + { + int nNeedRoot = uid && + (((willShut && _allowShutdown == SHUT_ROOT) || ++ ( willSuspend && _allowSuspend == SHUT_ROOT ) || + (_allowNuke == SHUT_ROOT && doesNuke))); + if (verify && nNeedRoot != needRoot) { + if (needRoot == 1) +@@ -425,7 +434,7 @@ KDMRadioButton::mouseDoubleClickEvent( Q + + + KDMDelayedPushButton::KDMDelayedPushButton( const KGuiItem &item, +- QWidget *parent, ++ QWidget *parent, + const char *name ) + : inherited( item, parent, name ) + , pop( 0 ) +@@ -490,6 +499,57 @@ KDMSlimShutdown::KDMSlimShutdown( QWidge + buttonlay->addWidget( btnReboot ); + connect( btnReboot, SIGNAL(clicked()), SLOT(slotReboot()) ); + ++ if ( _allowSuspend != SHUT_NONE ) ++ { ++ int supported = -1; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); ++ if (supported == 1) ++ suspend_ram = true; ++ else ++ suspend_ram = false; ++ ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_standby", &supported); ++ if (supported == 1) ++ standby = true; ++ else ++ standby = false; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_hibernate", &supported); ++ if (supported == 1) ++ suspend_disk = true; ++ else ++ suspend_disk = false; ++ ++/* if (liblazy_polkit_is_user_allowed_by_uid(0, "hal-power-hibernate", NULL) != 1) ++ suspend_disk = false; ++ if (liblazy_polkit_is_user_allowed_by_uid(0, "hal-power-suspend", NULL) != 1) ++ suspend_ram = false; ++ if (liblazy_polkit_is_user_allowed_by_uid(0, "hal-power-standby", NULL) != 1) ++ standby = false; ++*/ ++ int sum = standby + suspend_ram + suspend_disk; ++ if ( sum ) { ++ buttonlay->addSpacing( KDialog::spacingHint() ); ++ ++ QButton *btnSuspend; ++ if (sum > 1) { ++ btnSuspend = new KDMDelayedPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), this ); ++ QPopupMenu *suspends = new QPopupMenu(this); ++ if (suspend_disk) ++ suspends->insertItem(i18n("Suspend to Disk"), 1); ++ if (suspend_ram) ++ suspends->insertItem(i18n("Suspend to RAM"), 2); ++ if (standby) ++ suspends->insertItem(i18n("Standby"), 3); ++ connect(suspends, SIGNAL(activated(int)), SLOT(slotSuspend(int))); ++ static_cast<KDMDelayedPushButton*>(btnSuspend)->setPopup(suspends); ++ } else { ++ btnSuspend = new KPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), this ); ++ } ++ buttonlay->addWidget( btnSuspend ); ++ connect(btnSuspend, SIGNAL(clicked()), SLOT(slotSuspend())); ++ } ++ } ++ + GSet( 1 ); + GSendInt( G_ListBootOpts ); + if (GRecvInt() == BO_OK) { +@@ -536,6 +596,65 @@ KDMSlimShutdown::~KDMSlimShutdown() + freeStrArr( targetList ); + } + ++void KDMSlimShutdown::slotSuspend() ++{ ++ if (suspend_disk) ++ slotSuspend( 1 ); ++ else if (suspend_ram) ++ slotSuspend( 2 ); ++ else if ( standby ) ++ slotSuspend( 3 ); ++ else ++ reject(); ++} ++ ++void KDMSlimShutdown::slotSuspend(int id) ++{ ++ reject(); ++ // dpySpec *sess = fetchSessions( lstRemote | lstTTY ); ++ // it would be nice to show the sessions to suspend, but it ++ // would require string changes (coolo) ++ dpySpec *sess = 0; ++ kdDebug() << "slotSuspend " << _allowSuspend << endl; ++ if (sess || _allowSuspend == SHUT_ROOT) ++ { ++ int ret = KDMConfShutdown( -1, sess, SHUT_SUSPEND, 0 ).exec(); ++ if ( !ret ) ++ return; ++ } ++ ++ int error = 0; ++ int wake = 0; ++ DBusMessage *reply; ++ ++ if (suspend_disk && id == 1) { ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Hibernate", ++ &reply, ++ DBUS_TYPE_INVALID); ++ } else if (suspend_ram && id == 2) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Suspend", ++ &reply, ++ DBUS_TYPE_INT32, ++ &wake, ++ DBUS_TYPE_INVALID); ++ else if (standby && id == 3) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Standby", ++ &reply, ++ DBUS_TYPE_INVALID); ++ else { ++ return; ++ } ++} ++ + void + KDMSlimShutdown::slotSched() + { +@@ -601,16 +720,27 @@ KDMConfShutdown::KDMConfShutdown( int _u + if (type == SHUT_CONSOLE) + willShut = false; + #endif ++ QString title; ++ if ( type == SHUT_HALT) ++ title = i18n("Turn Off Computer"); ++ else { ++#ifdef HAVE_VTS ++ if ( type == SHUT_CONSOLE) ++ title = i18n("Switch to Console"); ++ else ++#endif ++ if ( type == SHUT_SUSPEND ) { ++ willSuspend = true; ++ title = i18n( "Suspend Computer" ); ++ } ++ else ++ title = i18n("Restart Computer"); ++ } ++ + box->addWidget( new QLabel( QString( "<qt><center><b><nobr>" + "%1%2" + "</nobr></b></center><br></qt>" ) +- .arg( (type == SHUT_HALT) ? +- i18n("Turn Off Computer") : +-#ifdef HAVE_VTS +- (type == SHUT_CONSOLE) ? +- i18n("Switch to Console") : +-#endif +- i18n("Restart Computer") ) ++ .arg( title ) + .arg( os ? + i18n("<br>(Next boot: %1)") + .arg( QString::fromLocal8Bit( os ) ) : +Index: kdm/kfrontend/kdmshutdown.h +=================================================================== +--- kdm/kfrontend/kdmshutdown.h.orig ++++ kdm/kfrontend/kdmshutdown.h +@@ -67,7 +67,7 @@ class KDMShutdownBase : public FDialog, + #else + static const bool willShut = true; + #endif +- bool mayNuke, doesNuke, mayOk, maySched; ++ bool mayNuke, doesNuke, mayOk, maySched, willSuspend; + + private slots: + void slotSched(); +@@ -118,7 +118,6 @@ class KDMShutdown : public KDMShutdownBa + QComboBox *targets; + int oldTarget; + int sch_st, sch_to; +- + }; + + class KDMRadioButton : public QRadioButton { +@@ -168,10 +167,13 @@ class KDMSlimShutdown : public FDialog { + void slotReboot(); + void slotReboot( int ); + void slotSched(); ++ void slotSuspend(); ++ void slotSuspend(int); + + private: + bool checkShutdown( int type, const char *os ); + char **targetList; ++ bool suspend_disk, suspend_ram, standby; + + }; + +Index: kdm/kfrontend/Makefile.am +=================================================================== +--- kdm/kfrontend/Makefile.am.orig ++++ kdm/kfrontend/Makefile.am +@@ -4,7 +4,7 @@ GENKDMCONF_FLAGS = + SUBDIRS = themer themes pics sessions + + AM_CPPFLAGS = -I$(srcdir)/../backend -I.. -I$(top_srcdir)/kcontrol/background \ +- -I$(top_srcdir)/kdmlib $(all_includes) ++ -I$(top_srcdir)/kdmlib $(all_includes) $(DBUS_INCS) + + bin_PROGRAMS = kdm_config kdm_greet krootimage genkdmconf kdmctl + +@@ -25,7 +25,7 @@ kdm_greet_SOURCES = \ + kgreeter.cpp \ + kgapp.cpp + kdm_greet_LDFLAGS = $(all_libraries) $(KDE_RPATH) +-kdm_greet_LDADD = themer/libkdmthemer.a $(LIB_KDEUI) $(XTESTLIB) $(LIBPOSIX4) ++kdm_greet_LDADD = themer/libkdmthemer.a $(LIB_KDEUI) $(XTESTLIB) $(LIBPOSIX4) -llazy $(DBUS_LIBS) + + krootimage_SOURCES = krootimage.cpp + krootimage_LDFLAGS = $(all_libraries) $(KDE_RPATH) diff --git a/opensuse/core/tdebase/kdm-sysconfig-values.diff b/opensuse/core/tdebase/kdm-sysconfig-values.diff new file mode 100644 index 000000000..c3b9f8af9 --- /dev/null +++ b/opensuse/core/tdebase/kdm-sysconfig-values.diff @@ -0,0 +1,737 @@ +Index: kdm/config.def +=================================================================== +--- kdm/config.def.orig ++++ kdm/config.def +@@ -792,6 +792,21 @@ Description: + <emphasis>Do not</emphasis> change it, you may interfere with future + upgrades and this could result in &kdm; failing to run. + ++Key: SUSEConfigVersion ++Type: string ++Default: "" ++CDefault: - ++User: dummy ++# will be overwritten ++Instance: ++Comment: ++ This option exists solely for the purpose of a clean automatic upgrade. ++ Do not even think about changing it! ++Description: ++ This option exists solely for the purpose of clean automatic upgrades. ++ <emphasis>Do not</emphasis> change it, you may interfere with future ++ upgrades and this could result in &kdm; failing to run. ++ + Key: PAMService + If: defined(USE_PAM) + Type: string +@@ -874,10 +889,10 @@ Description: + + Key: PidFile + Type: string +-Default: "" ++Default: "/var/run/kdm.pid" + User: core +-Instance: "/var/run/kdm.pid" +-Merge: xdm ++Instance: "" ++Update: reset_sec_0_1 + Comment: + Where &kdm; should store its PID (do not store if empty). + Description: +@@ -901,10 +916,10 @@ Description: + Key: AuthDir + Type: path + # differs from XDM +-Default: "/var/run/xauth" ++Default: "/var/lib/xdm/authdir/authfiles" + User: core +-Instance: #"/tmp" +-Merge: xdm(P_authDir) ++Instance: #"" ++Update: reset_sec_0_1 + Comment: + Where to store authorization files. + Description: +@@ -930,7 +945,7 @@ Description: + + Key: ExportList + Type: list +-Default: "" ++Default: "LANG,XCURSOR_THEME" + User: core + Instance: #"LD_LIBRARY_PATH,ANOTHER_IMPORTANT_VAR" + Merge: xdm(P_List) +@@ -1063,9 +1078,10 @@ Description: + + Key: Enable + Type: bool +-Default: true ++Default: false + User: dep(xdmcpEnable) + Instance: false ++Update: reset_sec_0_1 + Comment: & + Description: + Whether &kdm; should listen to incoming &XDMCP; requests. +@@ -1102,11 +1118,10 @@ Description: + Key: Xaccess + Type: string + # differs from xdm +-Default: *KDMCONF "/Xaccess" ++Default: *"/etc/X11/xdm/Xaccess" + User: config(Xaccess) +-Instance: #"" +-Update: mk_xaccess +-Merge: xdm:accessFile ++Instance: # ++Update: reset_sec_0_1 + Comment: + &XDMCP; access control file in the usual XDM-Xaccess format. + Description: +@@ -1164,13 +1179,11 @@ Description: + + Key: Willing + Type: string +-Default: "" ++Default: "/etc/X11/xdm/Xwilling" + User: core + # will be overwritten + Instance: # +-Update: mk_willing +-Merge: xdm +-Merge: kdm:Xwilling ++Update: reset_sec_0_1 + Comment: + The program which is invoked to dynamically generate replies to &XDMCP; + DirectQuery or BroadcastQuery requests. +@@ -1244,7 +1257,7 @@ Type: enum + None/BO_NONE: no boot manager + Grub/BO_GRUB: Grub boot manager + Lilo/BO_LILO: Lilo boot manager (Linux on i386 & x86-64 only) +-Default: None ++Default: Grub + User: core + User: greeter + Instance: #Grub +@@ -1347,6 +1360,7 @@ Default: DEF_SERVER_CMD + DDefault: - + User: core + Instance: :*/DEF_SERVER_CMD ++Update: reset_sec_0_1 + Comment: + The command line to start the &X-Server;, without display number and VT spec. + This string is subject to word splitting. +@@ -1355,7 +1369,7 @@ Description: + This string is subject to word splitting. + </para><para> + The default is something reasonable for the system on which &kdm; was built, +- like <command>/usr/X11R6/bin/X</command>. ++ like <command>/usr/bin/X</command>. + + Key: ServerArgsLocal + Type: string +@@ -1549,11 +1563,10 @@ Description: + Key: Resources + # XXX strictly speaking this is supposed to be a string list, i think. + Type: string +-Default: "" ++Default: "/etx/X11/xdm/Xresources" + User: core + Instance: #*/"" +-Update: cp_resources +-Merge: xdm ++Update: reset_sec_0_1 + Comment: + Specify a file with X-resources for the greeter, chooser and background. + The KDE frontend does not use this file, so you do not need it unless you +@@ -1581,12 +1594,11 @@ Description: + + Key: Setup + Type: string +-Default: "" ++Default: "/etc/X11/xdm/Xsetup" + User: core + # will be overwritten + Instance: #*/"" +-Update: mk_setup +-Merge: xdm ++Update: reset_sec_0_1 + Comment: + A program to run before the greeter is shown. Can be used to start an + xconsole or an alternative background generator. Subject to word splitting. +@@ -1602,12 +1614,11 @@ Description: + + Key: Startup + Type: string +-Default: "" ++Default: "/etc/X11/xdm/Xstartup" + User: core + # will be overwritten + Instance: #*/"" +-Update: mk_startup +-Merge: xdm ++Update: reset_sec_0_1 + Comment: + A program to run before a user session starts. Subject to word splitting. + Description: +@@ -1620,12 +1631,11 @@ Description: + + Key: Reset + Type: string +-Default: "" ++Default: "/etc/X11/xdm/Xreset" + User: core + # will be overwritten + Instance: #*/"" +-Update: mk_reset +-Merge: xdm ++Update: reset_sec_0_1 + Comment: + A program to run after a user session exits. Subject to word splitting. + Description: +@@ -1638,12 +1648,12 @@ Description: + + Key: Session + Type: string +-Default: XBINDIR "/xterm -ls -T" ++Default: "/etc/X11/xdm/Xsession" + #Merge: xdm - incompatible! + User: core + # will be overwritten + Instance: #*/"" +-Update: mk_session ++Update: reset_sec_0_1 + Comment: + The program which is run as the user which logs in. It is supposed to + interpret the session argument (see SessionsDirs) and start an appropriate +@@ -1746,10 +1756,11 @@ Description: + + Key: AllowRootLogin + Type: bool +-Default: true ++Default: false + User: core + User: greeter(showRoot) +-Instance: */false ++Instance: #*/false ++Update: reset_sec_1_2 + Merge: xdm + Comment: + Allow root logins? +@@ -1764,6 +1775,7 @@ User: core + # sensible? + Instance: */false + Instance: :*/true ++Update: reset_sec_0_1 + Merge: xdm + Comment: + Allow to log in, when user has set an empty password? +@@ -1775,12 +1787,13 @@ Type: enum + None/SHUT_NONE: no <guilabel>Shutdown...</guilabel> menu entry is shown at all + Root/SHUT_ROOT: the <systemitem class="username">root</systemitem> password must be entered to shut down + All/SHUT_ALL: everybody can shut down the machine +-Default: All ++Default: Root + User: core + User: greeter + Instance: */Root +-Instance: :*/All +-Merge: kdm:-Greeter/ ++Instance: #:*/All ++Update: reset_sec_0_1 ++#Merge: kdm:-Greeter/ + Comment: & + Description: + Who is allowed to shut down the system. This applies both to the +@@ -1866,6 +1879,7 @@ Type: bool + Default: false + User: dep + Instance: #:0/true ++Update: reset_sec_0_1 + Comment: & + Description: + Enable automatic login. <emphasis>Use with extreme care!</emphasis> +@@ -1899,7 +1913,7 @@ Default: "" + PostProc: PautoLoginX + User: core(autoUser) + User: greeter +-Instance: #:0/"fred" ++Instance: #:0/"" + Merge: xdm:autoUser(P_autoUser) + Comment: & + Description: +@@ -1930,10 +1944,10 @@ Description: + + Key: SessionsDirs + Type: list +-Default: KDMDATA "/sessions" ++Default: "/etc/X11/sessions," KDMDATA "/sessions,/usr/share/xsessions" + User: core + User: greeter-c +-Instance: #*/"/etc/X11/sessions,/usr/share/xsessions" ++Instance: #*/"" + Comment: + The directories containing session type definitions in .desktop format. + Description: +@@ -2008,7 +2022,8 @@ Type: enum + Clock/LOGO_CLOCK: a neat analog clock + Default: Clock + User: greeter +-Instance: */Logo ++Instance: */Clock ++Update: reset_sec_0_1 + Comment: + What should be shown in the greeter's logo are: + Description: +@@ -2223,7 +2238,7 @@ Description: + + Key: HiddenUsers + Type: list +-Default: "" ++Default: "root" + User: greeter-c(noUsers) + Instance: #*/"root" + # depends on {Min,Max}ShowUID +@@ -2363,13 +2378,14 @@ Type: enum + Default: OneStar + User: greeter + Instance: #*/NoEcho ++Update: reset_sec_0_1 + Comment: & + Description: + The password input fields cloak the typed in text. Specify, how to do it: + + Key: UseBackground + Type: bool +-Default: true ++Default: false + User: greeter + Instance: #*/! + Comment: +@@ -2507,6 +2523,7 @@ Type: bool + Default: false + User: greeter + Instance: :0/true ++Update: reset_sec_0_1 + Comment: + Enable &kdm;'s built-in xconsole. Note that this can be enabled for only + one display at a time. +@@ -2595,9 +2612,10 @@ Description: + + Key: Preloader + Type: string +-Default: "" ++Default: KDE_BINDIR "/preloadkde" + User: greeter-c +-Instance: */KDE_BINDIR "/preloadkde" ++Instance: */"" ++Update: reset_sec_0_1 + Comment: & + Description: + A program to run while the greeter is visible. It is supposed to preload +@@ -2606,7 +2624,7 @@ Description: + + Key: UseTheme + Type: bool +-Default: false ++Default: true + User: greeter + Instance: #*/true + Comment: & +@@ -2615,9 +2633,10 @@ Description: + + Key: Theme + Type: string +-Default: "" ++Default: KDMDATA "/themes/SUSE" + User: greeter +-Instance: */KDMDATA "/themes/circles" ++Instance: */"" ++Update: reset_sec_0_1 + Comment: & + Description: + The theme to use for the greeter. Can point to either a directory or an XML +Index: kdm/kfrontend/read_sysconfig.sh +=================================================================== +--- /dev/null ++++ kdm/kfrontend/read_sysconfig.sh +@@ -0,0 +1,147 @@ ++#!/bin/bash ++# ++# Copyright (c) 2006 SUSE Linux Products GmbH Nuernberg, Germany. ++# ++# Author: Stephan Kulow <coolo@suse.de> ++# ++ ++# ++# check if we are started as root ++# only one of UID and USER must be set correctly ++# ++if test "$UID" != 0 -a "$USER" != root; then ++ echo "You must be root to start $0." ++ exit 1 ++fi ++ ++# ++# check for sysconfig/displaymanager or rc.config ++# ++test -f /etc/sysconfig/displaymanager && source /etc/sysconfig/displaymanager ++test -f /etc/sysconfig/security && source /etc/sysconfig/security ++test -f /etc/sysconfig/language && source /etc/sysconfig/language ++ ++# ++# source /etc/profile to get $kdedir ++# ++kdedir="/opt/kde3" ++kdmdir="/var/adm/kdm" ++ ++# check for write permissions ++[ -w ${kdmdir} ] || mkdir -p ${kdmdir} ++[ -w ${kdmdir} ] || exit ++ ++# ++# Set Style of Shutdown ++# ++ECHO_MODE="OneStar" ++ALLOW_ROOT_LOGIN="true" ++case "$DISPLAYMANAGER_SHUTDOWN" in ++ all|ALL|All) ++ DISPLAYMANAGER_SHUTDOWN=All;; ++ none|NONE|None) ++ DISPLAYMANAGER_SHUTDOWN=None;; ++ auto|Auto|AUTO) ++ case "$PERMISSION_SECURITY" in ++ *easy*) ++ DISPLAYMANAGER_SHUTDOWN=All ++ ;; ++ *paranoid*) ++ ECHO_MODE="NoEcho" ++ ALLOW_ROOT_LOGIN="false" ++ DISPLAYMANAGER_SHUTDOWN=Root ++ ;; ++ *) ++ DISPLAYMANAGER_SHUTDOWN=Root ++ ;; ++ esac ++ ;; ++ * ) ++ DISPLAYMANAGER_SHUTDOWN=Root;; ++esac ++ ++( ++echo "[X-*-Greeter]" ++if [ -n "$KDM_USERS" ]; then ++ echo "ShowUsers=Selected" ++ echo -n "SelectedUsers=" ++ echo ${KDM_USERS}|sed -e 's@ [ ]*@ @g' -e 's@ @,@g' ++else ++ echo "ShowUsers=NotHidden" ++fi ++if [ "$DISPLAYMANAGER_AD_INTEGRATION" = "yes" ]; then ++ echo "PluginsLogin=winbind" ++fi ++if [ -n "$DISPLAYMANAGER_KDM_THEME" -a -d "/opt/kde3/share/apps/kdm/themes/$DISPLAYMANAGER_KDM_THEME" ]; then ++ echo "Theme=/opt/kde3/share/apps/kdm/themes/$DISPLAYMANAGER_KDM_THEME" ++ echo "UseTheme=true" ++ echo "UseBackground=false" ++else ++ echo "UseTheme=false" ++ echo "UseBackground=true" ++fi ++# kdm has en_US as default instead of simply reading LC_LANG :( ++echo "Language=" ++ ++echo "[Xdmcp]" ++if [ "$DISPLAYMANAGER_REMOTE_ACCESS" = "yes" ]; then ++ echo "Enable=true" ++else ++ echo "Enable=false" ++fi ++ ++echo "[X-:0-Core]" ++if [ "$DISPLAYMANAGER_AUTOLOGIN" ]; then ++ echo "AutoLoginEnable=true" ++ echo "AutoLoginUser=${DISPLAYMANAGER_AUTOLOGIN}" ++else ++ echo "AutoLoginEnable=false" ++fi ++if [ "$DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN" = "yes" ]; then ++ echo "ServerArgsLocal=" ++else ++ echo "ServerArgsLocal=-nolisten tcp" ++fi ++if [ "$DISPLAYMANAGER_PASSWORD_LESS_LOGIN" = "yes" ]; then ++ echo "NoPassEnable=true" ++ echo "NoPassAllUsers=true" ++else ++ echo "NoPassEnable=false" ++ echo "NoPassAllUsers=false" ++fi ++ ++echo "[X-:*-Core]" ++echo "AllowShutdown=${DISPLAYMANAGER_SHUTDOWN}" ++echo "AllowRootLogin=${ALLOW_ROOT_LOGIN}" ++echo "AllowNullPasswd=${ALLOW_ROOT_LOGIN}" ++ ++echo "[X-*-Core]" ++ ++if test "$DISPLAYMANAGER_ROOT_LOGIN_REMOTE" = "yes"; then ++ echo "AllowRootLogin=true" ++else ++ echo "AllowRootLogin=false" ++fi ++ ++case "$DISPLAYMANAGER_XSERVER" in ++ Xgl) ++ xgl=`type -p Xgl` ++ echo "ServerCmd=$xgl $DISPLAYMANAGER_XGL_OPTS -br" ++ echo "ServerTimeout=50" ++ ;; ++ Xorg) ++ xorg=`type -p Xorg` ++ echo "ServerCmd=$xorg -br" ++ ;; ++ *) ++ echo "#Unknown X server - leaving X" ++ ;; ++esac ++ ++echo "[General]" ++if [ "$DISPLAYMANAGER_STARTS_XSERVER" != "yes" ]; then ++ echo "StaticServers=" ++fi ++ ++) > ${kdmdir}/kdmrc.sysconfig ++ +Index: kdm/kfrontend/kdm_config.c +=================================================================== +--- kdm/kfrontend/kdm_config.c.orig ++++ kdm/kfrontend/kdm_config.c +@@ -386,7 +386,7 @@ static const char *kdmrc = KDMCONF "/kdm + static Section *rootsec; + + static void +-ReadConf() ++ReadConfFile(const char *rcfile) + { + const char *nstr, *dstr, *cstr, *dhost, *dnum, *dclass; + char *s, *e, *st, *en, *ek, *sl, *pt; +@@ -396,14 +396,9 @@ ReadConf() + int nlen, dlen, clen, dhostl, dnuml, dclassl; + int i, line, sectmoan, restl; + File file; +- static int confread; + +- if (confread) +- return; +- confread = 1; +- +- Debug( "reading config %s ...\n", kdmrc ); +- if (!readFile( &file, kdmrc, "master configuration" )) ++ Debug( "reading config %s ...\n", rcfile ); ++ if (!readFile( &file, rcfile, "master configuration" )) + return; + + for (s = file.buf, line = 0, cursec = 0, sectmoan = 1; s < file.eof; s++) { +@@ -429,7 +424,7 @@ ReadConf() + e--; + if (*e != ']') { + cursec = 0; +- LogError( "Invalid section header at %s:%d\n", kdmrc, line ); ++ LogError( "Invalid section header at %s:%d\n", rcfile, line ); + continue; + } + nstr = sl + 1; +@@ -438,8 +433,8 @@ ReadConf() + if (nlen == cursec->nlen && + !memcmp( nstr, cursec->name, nlen )) + { +- LogInfo( "Multiple occurrences of section [%.*s] in %s. " +- "Consider merging them.\n", nlen, nstr, kdmrc ); ++ Debug( "Multiple occurrences of section [%.*s] in %s. " ++ "Consider merging them.\n", nlen, nstr, rcfile ); + goto secfnd; + } + if (nstr[0] == 'X' && nstr[1] == '-') { +@@ -495,7 +490,7 @@ ReadConf() + illsec: + cursec = 0; + LogError( "Unrecognized section name [%.*s] at %s:%d\n", +- nlen, nstr, kdmrc, line ); ++ nlen, nstr, rcfile, line ); + continue; + newsec: + if (!(cursec = Malloc( sizeof(*cursec) ))) +@@ -523,7 +518,7 @@ ReadConf() + if (!cursec) { + if (sectmoan) { + sectmoan = 0; +- LogError( "Entry outside any section at %s:%d", kdmrc, line ); ++ LogError( "Entry outside any section at %s:%d", rcfile, line ); + } + goto sktoeol; + } +@@ -531,13 +526,13 @@ ReadConf() + for (; (s < file.eof) && (*s != '\n'); s++) + if (*s == '=') + goto haveeq; +- LogError( "Invalid entry (missing '=') at %s:%d\n", kdmrc, line ); ++ LogError( "Invalid entry (missing '=') at %s:%d\n", rcfile, line ); + continue; + + haveeq: + for (ek = s - 1; ; ek--) { + if (ek < sl) { +- LogError( "Invalid entry (empty key) at %s:%d\n", kdmrc, line ); ++ LogError( "Invalid entry (empty key) at %s:%d\n", rcfile, line ); + goto sktoeol; + } + if (!isspace( *ek )) +@@ -551,7 +546,7 @@ ReadConf() + if (*s == '\\') { + s++; + if (s >= file.eof || *s == '\n') { +- LogError( "Trailing backslash at %s:%d\n", kdmrc, line ); ++ LogError( "Trailing backslash at %s:%d\n", rcfile, line ); + break; + } + switch (*s) { +@@ -580,29 +575,42 @@ ReadConf() + goto keyok; + } + LogError( "Unrecognized key '%.*s' in section [%.*s] at %s:%d\n", +- nlen, nstr, cursec->nlen, cursec->name, kdmrc, line ); ++ nlen, nstr, cursec->nlen, cursec->name, rcfile, line ); + continue; + keyok: + for (curent = cursec->entries; curent; curent = curent->next) + if (ce == curent->ent) { + LogError( "Multiple occurrences of key '%s' in section [%.*s]" + " of %s\n", +- ce->name, cursec->nlen, cursec->name, kdmrc ); ++ ce->name, cursec->nlen, cursec->name, rcfile ); + goto keyfnd; + } + if (!(curent = Malloc( sizeof(*curent) ))) + return; ++ curent->next = cursec->entries; ++ cursec->entries = curent; ++ keyfnd: + curent->ent = ce; + curent->line = line; + curent->val = st; + curent->vallen = en - st; +- curent->next = cursec->entries; +- cursec->entries = curent; +- keyfnd: + continue; + } + } + ++static void ReadConf() ++{ ++ static int confread = 0; ++ ++ if (confread) ++ return; ++ confread++; ++ ++ system("/opt/kde3/share/apps/kdm/read_sysconfig.sh"); ++ ReadConfFile("/var/adm/kdm/kdmrc.sysconfig"); ++ ReadConfFile(kdmrc); ++} ++ + static Entry * + FindGEnt( int id ) + { +Index: kdm/kfrontend/genkdmconf.c +=================================================================== +--- kdm/kfrontend/genkdmconf.c.orig ++++ kdm/kfrontend/genkdmconf.c +@@ -66,6 +66,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #define stringify(x) __stringify(x) + + #define RCVERSTR stringify(RCVERMAJOR) "." stringify(RCVERMINOR) ++#define SUSERCVERSTR "2" + + static int old_scripts, no_old_scripts, old_confs, no_old, + no_backup, no_in_notice, use_destdir, mixed_scripts; +@@ -73,7 +74,7 @@ static const char *newdir = KDMCONF, *fa + *oldxdm, *oldkde; + + static int oldver; +- ++static int oldsusever; + + typedef struct StrList { + struct StrList *next; +@@ -462,6 +463,7 @@ wrconf( FILE *f ) + const char *cmt; + + putfqval( "General", "ConfigVersion", RCVERSTR ); ++ putfqval( "General", "SUSEConfigVersion", SUSERCVERSTR ); + for (cs = config; cs; cs = cs->next) { + fprintf( f, "%s[%s]\n", + cs->comment ? cs->comment : "\n", cs->name ); +@@ -1363,6 +1365,26 @@ upd_consolettys( Entry *ce, Section *cs + } + #endif + ++static void ++reset_sec_0_1( Entry *ce, Section *cs ATTR_UNUSED ) ++{ ++ if (oldsusever < 1 || !ce->written ) ++ { ++ ce->active = 0; ++ } ++ return; ++} ++ ++static void ++reset_sec_1_2( Entry *ce, Section *cs ATTR_UNUSED ) ++{ ++ if (oldsusever < 2 || !ce->written ) ++ { ++ ce->active = 0; ++ } ++ return; ++} ++ + #ifdef XDMCP + static void + cp_keyfile( Entry *ce, Section *cs ATTR_UNUSED ) +@@ -2228,7 +2250,7 @@ static int + mergeKdmRcNewer( const char *path ) + { + char *p; +- const char *cp, *sec, *key; ++ const char *cp, *sec, *key, *susever; + RSection *rootsect, *cs; + REntry *ce; + int i, j; +@@ -2291,8 +2313,12 @@ mergeKdmRcNewer( const char *path ) + } + + #ifdef XDMCP +- applydefs( kdmdefs_all, as(kdmdefs_all), path ); ++ /* applydefs( kdmdefs_all, as(kdmdefs_all), path ); */ + #endif ++ susever = getfqval( "General", "SUSEConfigVersion", "" ); ++ if (sscanf( susever, "%u", &oldsusever ) != 1) ++ oldsusever = 0; ++ + if (!*(cp = getfqval( "General", "ConfigVersion", "" ))) { /* < 3.1 */ + mod_usebg = 1; + if (is22conf( path )) { +Index: kdm/kfrontend/Makefile.am +=================================================================== +--- kdm/kfrontend/Makefile.am.orig ++++ kdm/kfrontend/Makefile.am +@@ -64,3 +64,7 @@ kdm_greet_COMPILE_FIRST = ../config.ci + kdm_config_COMPILE_FIRST = ../config.ci + genkdmconf_COMPILE_FIRST = ../config.ci + ++ ++appsdir = $(kde_datadir)/kdm ++apps_SCRIPTS = read_sysconfig.sh ++ diff --git a/opensuse/core/tdebase/kdm-use-rpmoptflags.diff b/opensuse/core/tdebase/kdm-use-rpmoptflags.diff new file mode 100644 index 000000000..85a03e02b --- /dev/null +++ b/opensuse/core/tdebase/kdm-use-rpmoptflags.diff @@ -0,0 +1,29 @@ +Index: kdm/backend/Makefile.am +=================================================================== +--- kdm/backend/Makefile.am.orig ++++ kdm/backend/Makefile.am +@@ -1,11 +1,6 @@ + # forcibly remove thread-related defines & flags + AUTOMAKE_OPTIONS = foreign +-CFLAGS = $(XDM_CFLAGS) -fno-strict-aliasing +-CPPFLAGS = $(USER_INCLUDES) $(X_INCLUDES) $(KRB4_INCS) $(KRB5_INCS) -I.. -I../.. +-LDFLAGS = $(USER_LDFLAGS) $(X_LDFLAGS) $(X_RPATH) $(KRB4_RPATH) $(KRB5_RPATH) +-LDADD = $(LIB_X11) -lXau $(LIBXDMCP) $(PASSWDLIBS) $(LIBSHADOW) $(LIBGEN) \ +- $(LIB_LIBS) $(KRB4_LIBS) $(KRB5_LIBS) $(LIBSOCKET) $(LIBRESOLV) \ +- $(LIBUCB) $(LIBUTIL) $(LIBPOSIX4) ++AM_CPPFLAGS = $(USER_INCLUDES) $(X_INCLUDES) $(KRB4_INCS) $(KRB5_INCS) -I.. -I../.. + + bin_PROGRAMS = kdm + kdm_SOURCES = \ +@@ -39,6 +34,11 @@ kdm_SOURCES = \ + xdmauth.c \ + xdmcp.c + ++kdm_LDFLAGS = $(USER_LDFLAGS) $(X_LDFLAGS) $(X_RPATH) $(KRB4_RPATH) $(KRB5_RPATH) ++kdm_LDADD = $(LIB_X11) -lXau $(LIBXDMCP) $(PASSWDLIBS) \ ++ $(LIB_LIBS) $(KRB4_LIBS) $(KRB5_LIBS) $(LIBSOCKET) $(LIBRESOLV) \ ++ $(LIBUCB) $(LIBUTIL) $(LIBPOSIX4) ++ + EXTRA_DIST = printf.c + + noinst_HEADERS = dm.h dm_socket.h dm_error.h dm_auth.h greet.h diff --git a/opensuse/core/tdebase/kdm-wordbreak.diff b/opensuse/core/tdebase/kdm-wordbreak.diff new file mode 100644 index 000000000..9c50ecdc9 --- /dev/null +++ b/opensuse/core/tdebase/kdm-wordbreak.diff @@ -0,0 +1,22 @@ +Index: kdm/kfrontend/kfdialog.cpp +=================================================================== +--- kdm/kfrontend/kfdialog.cpp.orig ++++ kdm/kfrontend/kfdialog.cpp +@@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fi + #include <klocale.h> + #include <kpushbutton.h> + #include <kstdguiitem.h> ++#include <kglobalsettings.h> + + #include <qlabel.h> + #include <qlayout.h> +@@ -137,6 +138,9 @@ KFMsgBox::KFMsgBox( QWidget *parent, QMe + QLabel *label1 = new QLabel( this ); + label1->setPixmap( QMessageBox::standardIcon( type ) ); + QLabel *label2 = new QLabel( text, this ); ++ QRect d = KGlobalSettings::desktopGeometry(this); ++ if ( label2->fontMetrics().size( 0, text).width() > d.width() * 3 / 5) ++ label2->setAlignment(Qt::WordBreak | Qt::AlignAuto ); + KPushButton *button = new KPushButton( KStdGuiItem::ok(), this ); + button->setDefault( true ); + button->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) ); diff --git a/opensuse/core/tdebase/kfontinst.diff b/opensuse/core/tdebase/kfontinst.diff new file mode 100644 index 000000000..51c5e59b6 --- /dev/null +++ b/opensuse/core/tdebase/kfontinst.diff @@ -0,0 +1,10 @@ +--- kcontrol/kfontinst/kfontinst/Main.cpp ++++ kcontrol/kfontinst/kfontinst/Main.cpp 2004/01/27 08:43:25 +@@ -80,6 +80,7 @@ + QStringList::ConstIterator xftIt; + + for(xftIt=CGlobal::cfg().getUserFontsDirs().begin(); xftIt!=CGlobal::cfg().getUserFontsDirs().end(); ++xftIt) ++ CMisc::doCmd("/sbin/conf.d/SuSEconfig.fonts", "--module", "fonts"); + CMisc::doCmd(XFT_CACHE_CMD, CMisc::xDirSyntax(*xftIt)); + #else + CMisc::doCmd(XFT_CACHE_CMD, CMisc::xDirSyntax(ds)); diff --git a/opensuse/core/tdebase/khelpcenter-beagle.diff b/opensuse/core/tdebase/khelpcenter-beagle.diff new file mode 100644 index 000000000..6b4314e6a --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-beagle.diff @@ -0,0 +1,172 @@ +Index: khelpcenter/searchhandlers/khc_beagle_search.pl +=================================================================== +--- /dev/null ++++ khelpcenter/searchhandlers/khc_beagle_search.pl +@@ -0,0 +1,88 @@ ++#!/usr/bin/perl -w ++# vim:sw=4:et ++ ++use warnings; ++use strict; ++use Getopt::Long; ++ ++sub isBeagleRunning() ++{ ++ open(IN, "-|") || exec "beagle-ping"; ++ while(<IN>) { ++ if (/^Daemon version:/) { ++ close(IN); ++ return 1; ++ } ++ } ++ close(IN); ++ return 0; ++} ++ ++sub formatHTML($$) ++{ ++ my ($query, $hits) = @_; ++ ++ print "<html>\n<body\n<ul>\n"; ++ ++ foreach my $hit(@$hits) { ++ print "<li>$hit</li>\n"; ++ } ++ print "</ul>\n</body>\n</html>\n"; ++} ++ ++sub beagleQuery($$$) ++{ ++ my ($words, $method, $maxnum) = @_; ++ ++ my @hits = (); ++ ++ open(IN, "-|") || exec "beagle-query", "--type", "DocbookEntry", "--type", "File", "--max-hits", $maxnum, @$words, "ext:docbook"; ++ while(<IN>) { ++ chop; ++ next if (/^Debug:/); ++ ++ my $uri = $_; ++ $uri = $1 if ($uri =~ /^file:\/\/(.*)$/); ++ ++ print "uri: $uri\n"; ++ my $helpLink = &makeHelpLink($uri); ++ ++ push(@hits, $helpLink) if (!grep { /^$helpLink$/ } @hits); ++ } ++ close(IN); ++ return @hits; ++} ++ ++sub makeHelpLink($) ++{ ++ # Try to figure out the name of the application from the path to its index.docbook file ++ ++ my ($path) = @_; ++ my @pathcomponents = split '/', $path; ++ ++ my $appName = $pathcomponents[-2]; ++ my $appName2 = $pathcomponents[-3]; ++ ++ if ($appName eq $appName2 or $appName2 eq "doc" ++ or (-d "/usr/share/locale/$appName2")) { ++ return "<a href=\"help:/$appName\">$appName</a>"; ++ } ++ return "<a href=\"help:/$appName2/$appName\">$appName ($appName2)</a>"; ++} ++ ++my $method = "and"; ++my $maxnum = 100; ++ ++GetOptions("method=s", \$method, "maxnum=i", \$maxnum); ++ ++my @hits = ("The Beagle daemon is not running, search is not available"); ++ ++my @words = @ARGV; ++ ++if (isBeagleRunning()) { ++ @hits = beagleQuery(\@words, $method, $maxnum); ++} ++ ++@hits = ("There are no search results") if ($#hits < 0); ++ ++formatHTML(\@words, \@hits); +Index: khelpcenter/searchhandlers/khc_beagle_index.pl +=================================================================== +--- /dev/null ++++ khelpcenter/searchhandlers/khc_beagle_index.pl +@@ -0,0 +1,49 @@ ++#!/usr/bin/perl ++# vim:sw=4:et ++ ++use warnings; ++ ++sub getKDEDocDir() ++{ ++ my $prefix = `kde-config --prefix`; ++ chomp $prefix; ++ ++ $prefix = "/opt/kde" if (not defined($prefix)); ++ return "$prefix/share/doc"; ++} ++ ++sub addRoot() ++{ ++ my $kdedocdir = &getKDEDocDir; ++ ++ open (IN, "-|") || exec "beagle-config", "indexing", "ListRoots"; ++ ++ my $kdedoc_found = 0; ++ while(<IN>) { ++ if (/^$kdedocdir/o) { ++ $kdedoc_found = 1; ++ last; ++ } ++ } ++ close(IN); ++ ++ if (not $kdedoc_found) { ++ `beagle-config indexing AddRoot $kdedocdir`; ++ `beagle-config indexing AddRoot $kdedocdir-bundle`; ++ } ++} ++ ++sub createExistsFile($$) ++{ ++ my ($idir, $ident) = @_; ++ ++ open(OUT, ">", "$idir/$idir"); ++ close(OUT); ++} ++ ++my $idir = $ARGV[0]; ++my $ident = $ARGV[1]; ++ ++if (addRoot) { ++ createExistsFile($idir, $ident); ++} +Index: khelpcenter/searchhandlers/docbook.desktop +=================================================================== +--- khelpcenter/searchhandlers/docbook.desktop.orig ++++ khelpcenter/searchhandlers/docbook.desktop +@@ -2,5 +2,5 @@ + + DocumentTypes=text/docbook + +-SearchCommand=khc_htsearch.pl --docbook --indexdir=%d --config=%i --words=%w --method=%o --maxnum=%m --lang=en +-IndexCommand=khc_docbookdig.pl --indexdir=%d --docpath=%p --identifier=%i ++SearchCommand=khc_beagle_search.pl --method=%o --maxnum=%m %w ++IndexCommand=khc_beagle_index.pl %d %i +Index: khelpcenter/searchhandlers/Makefile.am +=================================================================== +--- khelpcenter/searchhandlers/Makefile.am.orig ++++ khelpcenter/searchhandlers/Makefile.am +@@ -3,7 +3,7 @@ searchhandlers_DATA = htdig.desktop man. + searchhandlersdir = $(kde_datadir)/khelpcenter/searchhandlers + + kde_bin_SCRIPTS = khc_htdig.pl khc_htsearch.pl khc_mansearch.pl \ +- khc_docbookdig.pl ++ khc_docbookdig.pl khc_beagle_search.pl khc_beagle_index.pl + + htdigdata_DATA = htdig_long.html + diff --git a/opensuse/core/tdebase/khelpcenter-delayed-indexcheck.cpp b/opensuse/core/tdebase/khelpcenter-delayed-indexcheck.cpp new file mode 100644 index 000000000..37c3f195c --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-delayed-indexcheck.cpp @@ -0,0 +1,23 @@ +Index: khelpcenter/navigator.cpp +=================================================================== +--- khelpcenter/navigator.cpp.orig ++++ khelpcenter/navigator.cpp +@@ -121,8 +121,6 @@ Navigator::Navigator( View *view, QWidge + + mTabWidget = new QTabWidget( this ); + topLayout->addWidget( mTabWidget ); +- connect( mTabWidget, SIGNAL( currentChanged( QWidget * ) ), +- SLOT( slotTabChanged( QWidget * ) ) ); + + setupContentsTab(); + setupGlossaryTab(); +@@ -136,6 +134,9 @@ Navigator::Navigator( View *view, QWidge + mSearchWidget->updateScopeList(); + mSearchWidget->readConfig( KGlobal::config() ); + } ++ ++ connect( mTabWidget, SIGNAL( currentChanged( QWidget * ) ), ++ SLOT( slotTabChanged( QWidget * ) ) ); + } + + Navigator::~Navigator() diff --git a/opensuse/core/tdebase/khelpcenter-gnome-support-legacy.patch b/opensuse/core/tdebase/khelpcenter-gnome-support-legacy.patch new file mode 100644 index 000000000..fb9a11ee4 --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-gnome-support-legacy.patch @@ -0,0 +1,327 @@ +Index: khelpcenter/table-of-contents.xslt +================================================================================ +--- khelpcenter/docentry.cpp ++++ khelpcenter/docentry.cpp +@@ -1,5 +1,6 @@ + #include <qregexp.h> + #include <qfileinfo.h> ++#include <stdlib.h> + + #include <kdebug.h> + #include <kdesktopfile.h> +@@ -206,6 +207,37 @@ + { + KDesktopFile file( fileName ); + ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "DocEntry::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = file.readEntry ("OnlyShowIn"); ++ ++ kdDebug() << "DocEntry::readFromFile(): " << fileName << " onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return false; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return false; ++ } ++ ++ QString notShowIn = file.readEntry ("NotShowIn"); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return false; ++ } ++ + mName = file.readName(); + mSearch = file.readEntry( "X-DOC-Search" ); + mIcon = file.readIcon(); +--- khelpcenter/navigator.cpp ++++ khelpcenter/navigator.cpp +@@ -22,6 +22,7 @@ + #include <sys/types.h> + #include <sys/stat.h> + #include <unistd.h> ++#include <stdlib.h> + + #include <qdir.h> + #include <qfile.h> +@@ -275,6 +276,38 @@ + const QString &file ) + { + KDesktopFile desktopFile( file ); ++ ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "Navigator::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = desktopFile.readEntry ("OnlyShowIn"); ++ ++ kdDebug() << "Navigator::createItemFromDesktopFile(): " << file << " onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return; ++ } ++ ++ QString notShowIn = desktopFile.readEntry ("NotShowIn"); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return; ++ } ++ + QString docPath = desktopFile.readDocPath(); + if ( !docPath.isNull() ) { + // First parameter is ignored if second is an absolute path +@@ -317,6 +350,9 @@ + { + alternativeURL.setQuery("anchor="+url.ref()); + alternativeURL.setRef(QString::null); ++ } else if (url.url().endsWith("/index.html")) ++ { ++ alternativeURL = KURL (url.url().left (url.url().length() - strlen ("/index.html"))); + } + + // If the navigator already has the given URL selected, do nothing. +@@ -401,15 +437,43 @@ + TOC *tocTree = item->createTOC(); + kdDebug( 1400 ) << "slotItemSelected(): Trying to build TOC for " + << item->entry()->name() << endl; +- tocTree->setApplication( url.directory() ); ++ if (url.directory() != "/") ++ tocTree->setApplication( url.directory() ); ++ else ++ tocTree->setApplication( url.path() ); + QString doc = View::langLookup( url.path() ); + // Enforce the original .docbook version, in case langLookup returns a + // cached version + if ( !doc.isNull() ) { +- int pos = doc.find( ".html" ); +- if ( pos >= 0 ) { +- doc.replace( pos, 5, ".docbook" ); +- } ++ if (doc.endsWith( ".html" )) { ++ doc = doc.left (doc.length() - 5) + ".docbook"; ++ } ++ ++ QFileInfo di (doc); ++ if (!di.isFile()) { ++ ++ int last_slash = doc.findRev ('/'); ++ if (last_slash >= 1) { ++ ++ QString filename = doc.right(doc.length() - last_slash - 1); ++ if (filename == "index.html" || filename == "") { ++ ++ int slash2 = doc.findRev('/', last_slash -1); ++ if (slash2 != -1 && slash2 != 0) { ++ ++ int slash3 = doc.findRev('/', slash2 - 1); ++ if (slash3 != -1) { ++ QString xml_file = doc.left(last_slash) + "/" + doc.mid(slash3 + 1, slash2 - (slash3 + 1)) + ".xml"; ++ kdDebug() << "xml_file " << xml_file << endl; ++ QFileInfo fi(xml_file); ++ if (fi.exists()) ++ doc = xml_file; ++ ++ } ++ } ++ } ++ } ++ } + kdDebug( 1400 ) << "slotItemSelected(): doc = " << doc << endl; + + tocTree->build( doc ); +--- khelpcenter/navigatorappitem.cpp ++++ khelpcenter/navigatorappitem.cpp +@@ -21,6 +21,8 @@ + + #include "docentry.h" + ++#include <stdlib.h> ++ + #include <kdebug.h> + #include <kservicegroup.h> + +@@ -134,11 +136,42 @@ + + QString NavigatorAppItem::documentationURL( KService *s ) + { ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "NavigatorAppItem::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = s->property("OnlyShowIn", QVariant::String).toString(); ++ ++ kdDebug() << "NavigatorAppItem::onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return QString::null; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return QString::null; ++ } ++ ++ QString notShowIn = s->property("NotShowIn", QVariant::String).toString(); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return QString::null; ++ } ++ + QString docPath = s->property( "DocPath" ).toString(); + if ( docPath.isEmpty() ) + return QString::null; + +- if ( docPath.startsWith( "file:") || docPath.startsWith( "http:" ) ) ++ if ( docPath.startsWith( "file:") || docPath.startsWith( "http:" ) || docPath.startsWith( "ghelp:" )) + return docPath; + + return QString( "help:/" ) + docPath; +--- khelpcenter/table-of-contents.xslt ++++ khelpcenter/table-of-contents.xslt +@@ -8,6 +8,12 @@ + </table-of-contents> + </xsl:template> + ++<xsl:template match="article"> ++<table-of-contents> ++<xsl:apply-templates select="sect1"/> ++</table-of-contents> ++</xsl:template> ++ + <xsl:template match="chapter"> + <chapter> + <title><xsl:value-of select="title"/></title> +@@ -20,7 +26,15 @@ + <section> + <title><xsl:value-of select="title"/></title> + <anchor><xsl:value-of select="@id"/></anchor> ++<xsl:apply-templates select="sect2"/> + </section> + </xsl:template> + ++<xsl:template match="sect2"> ++<subsection> ++<title><xsl:value-of select="title"/></title> ++<anchor><xsl:value-of select="@id"/></anchor> ++</subsection> ++</xsl:template> ++ + </xsl:stylesheet> +--- khelpcenter/view.cpp ++++ khelpcenter/view.cpp +@@ -146,21 +146,51 @@ + // assemble the local search paths + const QStringList localDoc = KGlobal::dirs()->resourceDirs("html"); + ++ kdDebug() << "Looking up help for: " << fname << endl; ++ ++ QString path; ++ QString file_name; ++ int slash = fname.findRev ('/'); ++ if (slash == -1 || slash == 0) { ++ path = fname; ++ file_name = "/"; ++ } else { ++ path = fname.left (slash); ++ file_name = fname.right (fname.length() - slash); ++ } ++ ++ QStringList langs = KGlobal::locale()->languageList(); ++ QStringList::ConstIterator lang; ++ for (lang = langs.begin(); lang != langs.end(); ++lang) ++ if (*lang == "en") ++ search.append(QString("/opt/gnome/share/gnome/help/%1/C%2").arg(path).arg(file_name)); ++ else ++ search.append(QString("/opt/gnome/share/gnome/help/%1/%2%3").arg(path).arg(*lang).arg(file_name)); ++ ++ langs.append( "en" ); ++ langs.remove( "C" ); ++ ++ // this is kind of compat hack as we install our docs in en/ but the ++ // default language is en_US ++ for (QStringList::Iterator it = langs.begin(); it != langs.end(); ++it) ++ if ( *it == "en_US" ) ++ *it = "en"; ++ + // look up the different languages +- for (int id=localDoc.count()-1; id >= 0; --id) ++ int ldCount = localDoc.count(); ++ for (int id=0; id < ldCount; id++) + { +- QStringList langs = KGlobal::locale()->languageList(); +- langs.append( "en" ); +- langs.remove( "C" ); + QStringList::ConstIterator lang; + for (lang = langs.begin(); lang != langs.end(); ++lang) +- search.append(QString("%1%2/%3").arg(localDoc[id]).arg(*lang).arg(fname)); ++ search.append(QString("%1%2/%3").arg(localDoc[id]).arg(*lang).arg(path + file_name)); + } + + // try to locate the file + QStringList::Iterator it; + for (it = search.begin(); it != search.end(); ++it) + { ++ kdDebug() << "Looking for help in: " << *it << endl; ++ + QFileInfo info(*it); + if (info.exists() && info.isFile() && info.isReadable()) + return *it; +@@ -168,7 +198,7 @@ + // Fall back to the index.docbook for this language if we couldn't find its + // specific docbook file. If we are not looking up docbook (images, + // css etc) then look in other languages first. +- if ( ( *it ).endsWith( "docbook" ) ) ++ if ( ( *it ).endsWith( "docbook" ) || ( *it).endsWith( ".xml") ) + { + QString file = (*it).left((*it).findRev('/')) + "/index.docbook"; + info.setFile(file); +@@ -176,9 +206,15 @@ + { + return *it; + } ++ ++ file = (*it).left((*it).findRev('/')) + "/" + path + ".xml"; ++ info.setFile(file); ++ if (info.exists() && info.isFile() && info.isReadable()) ++ return *it; + } + } + ++ + return QString::null; + } + diff --git a/opensuse/core/tdebase/khelpcenter-gnome-support.patch b/opensuse/core/tdebase/khelpcenter-gnome-support.patch new file mode 100644 index 000000000..d98ae01dc --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-gnome-support.patch @@ -0,0 +1,335 @@ +Index: khelpcenter/docentry.cpp +=================================================================== +--- khelpcenter/docentry.cpp.orig ++++ khelpcenter/docentry.cpp +@@ -1,5 +1,6 @@ + #include <qregexp.h> + #include <qfileinfo.h> ++#include <stdlib.h> + + #include <kdebug.h> + #include <kdesktopfile.h> +@@ -206,6 +207,37 @@ bool DocEntry::readFromFile( const QStri + { + KDesktopFile file( fileName ); + ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "DocEntry::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = file.readEntry ("OnlyShowIn"); ++ ++ kdDebug() << "DocEntry::readFromFile(): " << fileName << " onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return false; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return false; ++ } ++ ++ QString notShowIn = file.readEntry ("NotShowIn"); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return false; ++ } ++ + mName = file.readName(); + mSearch = file.readEntry( "X-DOC-Search" ); + mIcon = file.readIcon(); +Index: khelpcenter/navigator.cpp +=================================================================== +--- khelpcenter/navigator.cpp.orig ++++ khelpcenter/navigator.cpp +@@ -22,6 +22,7 @@ + #include <sys/types.h> + #include <sys/stat.h> + #include <unistd.h> ++#include <stdlib.h> + + #include <qdir.h> + #include <qfile.h> +@@ -275,6 +276,38 @@ void Navigator::createItemFromDesktopFil + const QString &file ) + { + KDesktopFile desktopFile( file ); ++ ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "Navigator::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = desktopFile.readEntry ("OnlyShowIn"); ++ ++ kdDebug() << "Navigator::createItemFromDesktopFile(): " << file << " onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return; ++ } ++ ++ QString notShowIn = desktopFile.readEntry ("NotShowIn"); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return; ++ } ++ + QString docPath = desktopFile.readDocPath(); + if ( !docPath.isNull() ) { + // First parameter is ignored if second is an absolute path +@@ -317,6 +350,9 @@ void Navigator::selectItem( const KURL & + { + alternativeURL.setQuery("anchor="+url.ref()); + alternativeURL.setRef(QString::null); ++ } else if (url.url().endsWith("/index.html")) ++ { ++ alternativeURL = KURL (url.url().left (url.url().length() - strlen ("/index.html"))); + } + + // If the navigator already has the given URL selected, do nothing. +@@ -401,15 +437,43 @@ void Navigator::slotItemSelected( QListV + TOC *tocTree = item->createTOC(); + kdDebug( 1400 ) << "slotItemSelected(): Trying to build TOC for " + << item->entry()->name() << endl; +- tocTree->setApplication( url.directory() ); ++ if (url.directory() != "/") ++ tocTree->setApplication( url.directory() ); ++ else ++ tocTree->setApplication( url.path() ); + QString doc = View::langLookup( url.path() ); + // Enforce the original .docbook version, in case langLookup returns a + // cached version + if ( !doc.isNull() ) { +- int pos = doc.find( ".html" ); +- if ( pos >= 0 ) { +- doc.replace( pos, 5, ".docbook" ); +- } ++ if (doc.endsWith( ".html" )) { ++ doc = doc.left (doc.length() - 5) + ".docbook"; ++ } ++ ++ QFileInfo di (doc); ++ if (!di.isFile()) { ++ ++ int last_slash = doc.findRev ('/'); ++ if (last_slash >= 1) { ++ ++ QString filename = doc.right(doc.length() - last_slash - 1); ++ if (filename == "index.html" || filename == "") { ++ ++ int slash2 = doc.findRev('/', last_slash -1); ++ if (slash2 != -1 && slash2 != 0) { ++ ++ int slash3 = doc.findRev('/', slash2 - 1); ++ if (slash3 != -1) { ++ QString xml_file = doc.left(last_slash) + "/" + doc.mid(slash3 + 1, slash2 - (slash3 + 1)) + ".xml"; ++ kdDebug() << "xml_file " << xml_file << endl; ++ QFileInfo fi(xml_file); ++ if (fi.exists()) ++ doc = xml_file; ++ ++ } ++ } ++ } ++ } ++ } + kdDebug( 1400 ) << "slotItemSelected(): doc = " << doc << endl; + + tocTree->build( doc ); +Index: khelpcenter/navigatorappitem.cpp +=================================================================== +--- khelpcenter/navigatorappitem.cpp.orig ++++ khelpcenter/navigatorappitem.cpp +@@ -21,6 +21,8 @@ + + #include "docentry.h" + ++#include <stdlib.h> ++ + #include <kdebug.h> + #include <kservicegroup.h> + +@@ -134,11 +136,42 @@ void NavigatorAppItem::populate( bool re + + QString NavigatorAppItem::documentationURL( KService *s ) + { ++ static QString desktop; ++ if (desktop.isNull()) { ++ QString win_man = getenv("WINDOWMANAGER"); ++ if (win_man.contains ("gnome", FALSE)) ++ desktop = "GNOME"; ++ else if (win_man.contains ("kde", FALSE)) ++ desktop = "KDE"; ++ else ++ desktop = ""; ++ kdDebug() << "NavigatorAppItem::desktop = " << desktop << endl; ++ }; ++ ++ QString onlyShowIn = s->property("OnlyShowIn", QVariant::String).toString(); ++ ++ kdDebug() << "NavigatorAppItem::onlyShowIn = " << onlyShowIn << endl; ++ ++ if ( !onlyShowIn.isNull() ) { ++ if (desktop.isEmpty()) ++ return QString::null; ++ QStringList list = QStringList::split (";", onlyShowIn); ++ if ( ! list.contains (desktop) ) ++ return QString::null; ++ } ++ ++ QString notShowIn = s->property("NotShowIn", QVariant::String).toString(); ++ if ( !notShowIn.isNull() ) { ++ QStringList list = QStringList::split (";", notShowIn); ++ if ( list.contains (desktop) ) ++ return QString::null; ++ } ++ + QString docPath = s->property( "DocPath" ).toString(); + if ( docPath.isEmpty() ) + return QString::null; + +- if ( docPath.startsWith( "file:") || docPath.startsWith( "http:" ) ) ++ if ( docPath.startsWith( "file:") || docPath.startsWith( "http:" ) || docPath.startsWith( "ghelp:" )) + return docPath; + + return QString( "help:/" ) + docPath; +Index: khelpcenter/table-of-contents.xslt +=================================================================== +--- khelpcenter/table-of-contents.xslt.orig ++++ khelpcenter/table-of-contents.xslt +@@ -8,6 +8,12 @@ + </table-of-contents> + </xsl:template> + ++<xsl:template match="article"> ++<table-of-contents> ++<xsl:apply-templates select="sect1"/> ++</table-of-contents> ++</xsl:template> ++ + <xsl:template match="chapter"> + <chapter> + <title><xsl:value-of select="title"/></title> +@@ -20,7 +26,15 @@ + <section> + <title><xsl:value-of select="title"/></title> + <anchor><xsl:value-of select="@id"/></anchor> ++<xsl:apply-templates select="sect2"/> + </section> + </xsl:template> + ++<xsl:template match="sect2"> ++<subsection> ++<title><xsl:value-of select="title"/></title> ++<anchor><xsl:value-of select="@id"/></anchor> ++</subsection> ++</xsl:template> ++ + </xsl:stylesheet> +Index: khelpcenter/view.cpp +=================================================================== +--- khelpcenter/view.cpp.orig ++++ khelpcenter/view.cpp +@@ -150,21 +150,51 @@ QString View::langLookup( const QString + // assemble the local search paths + const QStringList localDoc = KGlobal::dirs()->resourceDirs("html"); + ++ kdDebug() << "Looking up help for: " << fname << endl; ++ ++ QString path; ++ QString file_name; ++ int slash = fname.findRev ('/'); ++ if (slash == -1 || slash == 0) { ++ path = fname; ++ file_name = "/"; ++ } else { ++ path = fname.left (slash); ++ file_name = fname.right (fname.length() - slash); ++ } ++ ++ QStringList langs = KGlobal::locale()->languageList(); ++ QStringList::ConstIterator lang; ++ for (lang = langs.begin(); lang != langs.end(); ++lang) ++ if (*lang == "en") ++ search.append(QString("/usr/share/gnome/help/%1/C%2").arg(path).arg(file_name)); ++ else ++ search.append(QString("/usr/share/gnome/help/%1/%2%3").arg(path).arg(*lang).arg(file_name)); ++ ++ langs.append( "en" ); ++ langs.remove( "C" ); ++ ++ // this is kind of compat hack as we install our docs in en/ but the ++ // default language is en_US ++ for (QStringList::Iterator it = langs.begin(); it != langs.end(); ++it) ++ if ( *it == "en_US" ) ++ *it = "en"; ++ + // look up the different languages +- for (int id=localDoc.count()-1; id >= 0; --id) ++ int ldCount = localDoc.count(); ++ for (int id=0; id < ldCount; id++) + { +- QStringList langs = KGlobal::locale()->languageList(); +- langs.append( "en" ); +- langs.remove( "C" ); + QStringList::ConstIterator lang; + for (lang = langs.begin(); lang != langs.end(); ++lang) +- search.append(QString("%1%2/%3").arg(localDoc[id]).arg(*lang).arg(fname)); ++ search.append(QString("%1%2/%3").arg(localDoc[id]).arg(*lang).arg(path + file_name)); + } + + // try to locate the file + QStringList::Iterator it; + for (it = search.begin(); it != search.end(); ++it) + { ++ kdDebug() << "Looking for help in: " << *it << endl; ++ + QFileInfo info(*it); + if (info.exists() && info.isFile() && info.isReadable()) + return *it; +@@ -172,7 +202,7 @@ QString View::langLookup( const QString + // Fall back to the index.docbook for this language if we couldn't find its + // specific docbook file. If we are not looking up docbook (images, + // css etc) then look in other languages first. +- if ( ( *it ).endsWith( "docbook" ) ) ++ if ( ( *it ).endsWith( "docbook" ) || ( *it).endsWith( ".xml") ) + { + QString file = (*it).left((*it).findRev('/')) + "/index.docbook"; + info.setFile(file); +@@ -180,9 +210,15 @@ QString View::langLookup( const QString + { + return *it; + } ++ ++ file = (*it).left((*it).findRev('/')) + "/" + path + ".xml"; ++ info.setFile(file); ++ if (info.exists() && info.isFile() && info.isReadable()) ++ return *it; + } + } + ++ + return QString::null; + } + diff --git a/opensuse/core/tdebase/khelpcenter-localindices.patch b/opensuse/core/tdebase/khelpcenter-localindices.patch new file mode 100644 index 000000000..a2b41a78a --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-localindices.patch @@ -0,0 +1,41 @@ +Index: khelpcenter/kcmhelpcenter.cpp +=================================================================== +--- khelpcenter/kcmhelpcenter.cpp.orig ++++ khelpcenter/kcmhelpcenter.cpp +@@ -321,6 +321,7 @@ bool KCMHelpCenter::save() + + void KCMHelpCenter::load() + { ++ findWriteableIndexDir(); + mIndexDirLabel->setText( Prefs::indexDirectory() ); + + mListView->clear(); +@@ -675,6 +676,12 @@ void KCMHelpCenter::checkSelection() + enableButtonOK( count != 0 ); + } + ++void KCMHelpCenter::findWriteableIndexDir() ++{ ++ QFileInfo currentDir( Prefs::indexDirectory() ); ++ if ( !currentDir.isWritable() ) ++ Prefs::setIndexDirectory( KGlobal::dirs()->saveLocation("data", "khelpcenter/index/") ); ++} + #include "kcmhelpcenter.moc" + + // vim:ts=2:sw=2:et +Index: khelpcenter/kcmhelpcenter.h +=================================================================== +--- khelpcenter/kcmhelpcenter.h.orig ++++ khelpcenter/kcmhelpcenter.h +@@ -146,6 +146,11 @@ class KCMHelpCenter : public KDialogBase + + void advanceProgress(); + ++ /** ++ * Find a user-writeable location for the indices, if the current location ++ * is not. ++ */ ++ void findWriteableIndexDir(); + private: + KHC::SearchEngine *mEngine; + diff --git a/opensuse/core/tdebase/khelpcenter-use-suseconfig-indexer.diff b/opensuse/core/tdebase/khelpcenter-use-suseconfig-indexer.diff new file mode 100644 index 000000000..e63e26ff7 --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-use-suseconfig-indexer.diff @@ -0,0 +1,25 @@ +Index: khelpcenter/navigator.cpp +=================================================================== +--- khelpcenter/navigator.cpp.orig ++++ khelpcenter/navigator.cpp +@@ -654,10 +654,16 @@ void Navigator::hideSearch() + + bool Navigator::checkSearchIndex() + { +- KConfig *cfg = KGlobal::config(); +- cfg->setGroup( "Search" ); +- if ( cfg->readBoolEntry( "IndexExists", false ) ) return true; +- ++ // just check that the index dir contains something ++ QDir indexDir( Prefs::indexDirectory() ); ++ QStringList dirEntries = indexDir.entryList(); ++ QStringList::Iterator it = dirEntries.begin(); ++ const QStringList::Iterator end = dirEntries.end(); ++ for ( ; it != end; ++it ) ++ { ++ if ( *it != "." && *it != ".." ) ++ return true; ++ } + if ( mIndexDialog && mIndexDialog->isShown() ) return true; + + QString text = i18n( "A search index does not yet exist. Do you want " diff --git a/opensuse/core/tdebase/khelpcenter-use-susehelp.diff b/opensuse/core/tdebase/khelpcenter-use-susehelp.diff new file mode 100644 index 000000000..6c130a6d1 --- /dev/null +++ b/opensuse/core/tdebase/khelpcenter-use-susehelp.diff @@ -0,0 +1,13 @@ +Index: kdebase-3.5.10/khelpcenter/khelpcenter.desktop +=================================================================== +--- kdebase-3.5.10.orig/khelpcenter/khelpcenter.desktop ++++ kdebase-3.5.10/khelpcenter/khelpcenter.desktop +@@ -127,7 +127,7 @@ Icon=khelpcenter + DocPath=khelpcenter/index.html + Type=Service + Terminal=false +-Exec=khelpcenter %u ++Exec=susehelp %u + SwallowExec= + SwallowTitle= + X-KDE-StartupNotify=true diff --git a/opensuse/core/tdebase/khotkeys-multimedia-action.diff b/opensuse/core/tdebase/khotkeys-multimedia-action.diff new file mode 100644 index 000000000..050e31d60 --- /dev/null +++ b/opensuse/core/tdebase/khotkeys-multimedia-action.diff @@ -0,0 +1,345 @@ +Index: khotkeys/data/multimedia_keys.khotkeys +=================================================================== +--- /dev/null ++++ khotkeys/data/multimedia_keys.khotkeys +@@ -0,0 +1,311 @@ ++[Data] ++DataCount=1 ++ ++[Data_1] ++Comment=This group contains actions that are set up by default.\n ++DataCount=8 ++Enabled=true ++Name=Preset Actions ++SystemGroup=0 ++Type=ACTION_DATA_GROUP ++AllowMerge=true ++ ++[Data_1Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_1] ++Comment=Opens the My Computer window when the multimedia My Computer key is pressed.\n ++Enabled=true ++Name=My Computer ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_1Actions] ++ActionsCount=1 ++ ++[Data_1_1Actions0] ++CommandURL=sysinfo:/ ++Type=COMMAND_URL ++ ++[Data_1_1Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_1Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_1Triggers0] ++Key=XF86MyComputer ++Type=SHORTCUT ++ ++[Data_1_2] ++Comment=Launch or activate Amarok when the multimedia Media key is pressed.\n ++Enabled=true ++Name=Media ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_2Actions] ++ActionsCount=1 ++ ++[Data_1_2Actions0] ++CommandURL=amarok ++Type=COMMAND_URL ++ ++[Data_1_2Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_2Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_2Triggers0] ++Key=XF86AudioMedia ++Type=SHORTCUT ++ ++[Data_1_3] ++Comment=When the multimedia Calculator key is pressed, KCalc is either launched or activated if it is already running.\n ++DataCount=2 ++Enabled=true ++Name=Calculator ++SystemGroup=0 ++Type=ACTION_DATA_GROUP ++ ++[Data_1_3Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_3_1] ++Comment=Runs KCalc if it is not already running.\n ++Enabled=true ++Name=Run KCalc ++Type=GENERIC_ACTION_DATA ++ ++[Data_1_3_1Actions] ++ActionsCount=1 ++ ++[Data_1_3_1Actions0] ++CommandURL=kcalc ++Type=COMMAND_URL ++ ++[Data_1_3_1Conditions] ++Comment= ++ConditionsCount=1 ++ ++[Data_1_3_1Conditions0] ++ConditionsCount=1 ++Type=NOT ++ ++[Data_1_3_1Conditions00] ++Type=EXISTING_WINDOW ++ ++[Data_1_3_1Conditions00Window] ++Comment=kcalc ++WindowsCount=1 ++ ++[Data_1_3_1Conditions00Window0] ++Class=kcalc Kcalc ++ClassType=2 ++Comment=kcalc ++Role=kcalc-mainwindow#1 ++RoleType=0 ++Title=KCalc ++TitleType=0 ++Type=SIMPLE ++WindowTypes=1 ++ ++[Data_1_3_1Triggers] ++Comment= ++TriggersCount=1 ++ ++[Data_1_3_1Triggers0] ++Key=XF86Calculator ++Type=SHORTCUT ++ ++[Data_1_3_2] ++Comment=Activates KCalc window if it is already running.\n ++Enabled=true ++Name=Activate KCalc ++Type=GENERIC_ACTION_DATA ++ ++[Data_1_3_2Actions] ++ActionsCount=1 ++ ++[Data_1_3_2Actions0] ++Type=ACTIVATE_WINDOW ++ ++[Data_1_3_2Actions0Window] ++Comment=kcalc ++WindowsCount=1 ++ ++[Data_1_3_2Actions0Window0] ++Class=kcalc Kcalc ++ClassType=2 ++Comment=kcalc ++Role=kcalc-mainwindow#1 ++RoleType=0 ++Title=KCalc ++TitleType=0 ++Type=SIMPLE ++WindowTypes=1 ++ ++[Data_1_3_2Conditions] ++Comment= ++ConditionsCount=1 ++ ++[Data_1_3_2Conditions0] ++Type=EXISTING_WINDOW ++ ++[Data_1_3_2Conditions0Window] ++Comment=kcalc ++WindowsCount=1 ++ ++[Data_1_3_2Conditions0Window0] ++Class=kcalc Kcalc ++ClassType=2 ++Comment=kcalc ++Role=kcalc-mainwindow#1 ++RoleType=0 ++Title=KCalc ++TitleType=0 ++Type=SIMPLE ++WindowTypes=1 ++ ++[Data_1_3_2Triggers] ++Comment= ++TriggersCount=1 ++ ++[Data_1_3_2Triggers0] ++Key=XF86Calculator ++Type=SHORTCUT ++ ++[Data_1_4] ++Comment=Launches the default terminal application when the multimedia Terminal key is pressed.\n ++Enabled=true ++Name=Terminal ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_4Actions] ++ActionsCount=1 ++ ++[Data_1_4Actions0] ++CommandURL=KHOTKEYS_TERMINAL ++Type=COMMAND_URL ++ ++[Data_1_4Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_4Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_4Triggers0] ++Key=XF86Terminal ++Type=SHORTCUT ++ ++[Data_1_5] ++Comment=Opens the default browser when the multimedia WWW key is pressed.\n ++Enabled=true ++Name=Browser (HomePage) ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_5Actions] ++ActionsCount=1 ++ ++[Data_1_5Actions0] ++CommandURL=KHOTKEYS_BROWSER ++Type=COMMAND_URL ++ ++[Data_1_5Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_5Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_5Triggers0] ++Key=XF86WWW ++Type=SHORTCUT ++ ++[Data_1_6] ++Comment=Ejecting when the multimedia Eject key is pressed.\n ++Enabled=true ++Name=Eject ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_6Actions] ++ActionsCount=1 ++ ++[Data_1_6Actions0] ++CommandURL=kdeeject "" ++Type=COMMAND_URL ++ ++[Data_1_6Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_6Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_6Triggers0] ++Key=XF86Eject ++Type=SHORTCUT ++ ++[Data_1_7] ++Comment=Launches KFind when the multimedia Search key is pressed.\n ++Enabled=true ++Name=Search ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_7Actions] ++ActionsCount=1 ++ ++[Data_1_7Actions0] ++CommandURL=kfind ++Type=COMMAND_URL ++ ++[Data_1_7Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_7Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_7Triggers0] ++Key=XF86Search ++Type=SHORTCUT ++ ++[Data_1_8] ++Comment=Opens a new mail composer window when the multimedia Mail key is pressed.\n ++Enabled=true ++Name=Launch Mail ++Type=COMMAND_URL_SHORTCUT_ACTION_DATA ++ ++[Data_1_8Actions] ++ActionsCount=1 ++ ++[Data_1_8Actions0] ++CommandURL=mailto:? ++Type=COMMAND_URL ++ ++[Data_1_8Conditions] ++Comment= ++ConditionsCount=0 ++ ++[Data_1_8Triggers] ++Comment=Simple_action ++TriggersCount=1 ++ ++[Data_1_8Triggers0] ++Key=XF86Mail ++Type=SHORTCUT ++ ++[Main] ++Version=2 ++ImportId=multimedia_keys ++ +Index: khotkeys/data/Makefile.am +=================================================================== +--- khotkeys/data/Makefile.am.orig ++++ khotkeys/data/Makefile.am +@@ -1,7 +1,9 @@ +-khotkeys_data_DATA = kde32b1.khotkeys konqueror_gestures_kde321.khotkeys printscreen.khotkeys ++khotkeys_data_DATA = kde32b1.khotkeys konqueror_gestures_kde321.khotkeys printscreen.khotkeys \ ++ multimedia_keys.khotkeys + khotkeys_datadir = $(kde_datadir)/khotkeys + +-khotkeys_update_DATA = khotkeys_32b1_update.upd konqueror_gestures_kde321_update.upd khotkeys_printscreen.upd ++khotkeys_update_DATA = khotkeys_32b1_update.upd konqueror_gestures_kde321_update.upd khotkeys_printscreen.upd \ ++ khotkeys_multimedia_keys.upd + khotkeys_updatedir = $(kde_datadir)/kconf_update + + EXTRA_DIST = $(khotkeys_data_DATA) $(khotkeys_update_DATA) +Index: khotkeys/data/khotkeys_multimedia_keys.upd +=================================================================== +--- /dev/null ++++ khotkeys/data/khotkeys_multimedia_keys.upd +@@ -0,0 +1,8 @@ ++Id=multimedia_keys ++# the file is intentionally a dummy, as the binary will update khotkeysrc, ++# the khotkeys_update will just remember it has been done ++File=khotkeys_update ++Group=Dummy ++Options=overwrite ++ScriptArguments=--id multimedia_keys ++Script=khotkeys_update diff --git a/opensuse/core/tdebase/khotkeys-multimedia-action2.diff b/opensuse/core/tdebase/khotkeys-multimedia-action2.diff new file mode 100644 index 000000000..9f995b1ab --- /dev/null +++ b/opensuse/core/tdebase/khotkeys-multimedia-action2.diff @@ -0,0 +1,81 @@ +Index: khotkeys/shared/actions.cpp +=================================================================== +--- khotkeys/shared/actions.cpp.orig ++++ khotkeys/shared/actions.cpp +@@ -29,6 +29,7 @@ + #include <kaccel.h> + #include <kservice.h> + #include <kprocess.h> ++#include <qregexp.h> + + #include "windows.h" + #include "action_data.h" +@@ -116,7 +117,6 @@ void Command_url_action::execute() + { + if( command_url().isEmpty()) + return; +- KURIFilterData uri; + QString cmd = command_url(); + static bool sm_ready = false; + if( !sm_ready ) +@@ -124,6 +124,9 @@ void Command_url_action::execute() + kapp->propagateSessionManager(); + sm_ready = true; + } ++ if( substituteAndHandleSpecial( cmd )) ++ return; ++ KURIFilterData uri; + // int space_pos = command_url().find( ' ' ); + // if( command_url()[ 0 ] != '\'' && command_url()[ 0 ] != '"' && space_pos > -1 + // && command_url()[ space_pos - 1 ] != '\\' ) +@@ -176,6 +179,38 @@ void Command_url_action::execute() + timeout.start( 1000, true ); // 1sec timeout + } + ++// do special command substitutions, return true if also already handled ++bool Command_url_action::substituteAndHandleSpecial( QString& cmd ) ++ { ++ if( cmd.contains( "KHOTKEYS_BROWSER" )) ++ { // the default browser ++ KConfig config( QString::fromLatin1("kfmclientrc")); // see KRun ++ config.setGroup("General"); ++ QString browser = config.readEntry("BrowserApplication"); ++ if( browser.startsWith( QString::fromLatin1( "!" ))) ++ browser = browser.mid( 1 ); ++ else ++ { ++ KService::Ptr service = KService::serviceByStorageId( browser ); ++ if( service ) ++ { ++ browser = service->exec(); ++ browser.replace( QRegExp( " %.?" ), "" ); // remove " %u" and others ++ } ++ } ++ if( browser.isEmpty()) ++ browser = QString::fromLatin1( "konqueror" ); // opens in webbrowsing profile by default ++ cmd = cmd.replace( "KHOTKEYS_BROWSER", browser ); ++ } ++ if( cmd.contains( "KHOTKEYS_TERMINAL" )) ++ { // the default terminal application ++ KConfigGroup config( KGlobal::config(), "General" ); ++ QString terminal = config.readPathEntry( "TerminalApplication", "konsole" ); ++ cmd = cmd.replace( "KHOTKEYS_TERMINAL", terminal ); ++ } ++ return false; ++ } ++ + QString Command_url_action::description() const + { + return i18n( "Command/URL : " ) + command_url(); +Index: khotkeys/shared/actions.h +=================================================================== +--- khotkeys/shared/actions.h.orig ++++ khotkeys/shared/actions.h +@@ -75,6 +75,7 @@ class KDE_EXPORT Command_url_action + protected: + QTimer timeout; + private: ++ bool substituteAndHandleSpecial( QString& cmd ); + QString _command_url; + }; + diff --git a/opensuse/core/tdebase/kicker-defaults.diff b/opensuse/core/tdebase/kicker-defaults.diff new file mode 100644 index 000000000..a92cae562 --- /dev/null +++ b/opensuse/core/tdebase/kicker-defaults.diff @@ -0,0 +1,57 @@ +Index: kcontrol/kcontrol/KControl.desktop +=================================================================== +--- kcontrol/kcontrol/KControl.desktop.orig ++++ kcontrol/kcontrol/KControl.desktop +@@ -7,7 +7,9 @@ Type=Application + DocPath=kcontrol/index.html + X-KDE-StartupNotify=true + +-Name=Control Center ++GenericName=Configure Desktop ++GenericName[de]=Desktop-Einstellungen ++Name=Personal Settings + Name[af]=Beheer Sentrum + Name[ar]=مركز التØكم + Name[az]=Ä°darÉ™ MÉ™rkÉ™zi +@@ -93,3 +95,4 @@ Name[zu]=Indawo Yokulawula + + X-DCOP-ServiceType=Unique + Categories=Qt;KDE;Core; ++Keywords=control,center +Index: kicker/libkicker/kickerSettings.kcfg +=================================================================== +--- kicker/libkicker/kickerSettings.kcfg.orig ++++ kicker/libkicker/kickerSettings.kcfg +@@ -159,7 +159,7 @@ + + <entry name="MenuExtensions" key="Extensions" type="StringList" > + <label>Optional Menus</label> +- <default>prefmenu.desktop,systemmenu.desktop</default> ++ <default>recentdocs.desktop,systemmenu.desktop</default> + </entry> + + <entry name="RecentAppsStat" type="StringList" > +Index: kicker/menuext/system/systemmenu.desktop +=================================================================== +--- kicker/menuext/system/systemmenu.desktop.orig ++++ kicker/menuext/system/systemmenu.desktop +@@ -1,5 +1,5 @@ + [Desktop Entry] +-Name=System Menu ++Name=My System + Name[af]=Stelsel Kieslys + Name[ar]=قائمة النظام + Name[be]=СіÑÑ‚Ñмнае меню +Index: kcontrol/kicker/hidingtab_impl.cpp +=================================================================== +--- kcontrol/kicker/hidingtab_impl.cpp.orig ++++ kcontrol/kicker/hidingtab_impl.cpp +@@ -200,7 +200,7 @@ void HidingTab::defaults() + m_delaySpinBox->setValue( 3 ); + m_autoHideSwitch->setChecked( false ); + m_lHB->setChecked( false ); +- m_rHB->setChecked( true ); ++ m_rHB->setChecked( false ); + m_animateHiding->setChecked( true ); + m_hideSlider->setValue( 10 ); + m_delaySpinBox->setValue( 3 ); diff --git a/opensuse/core/tdebase/kickerrc b/opensuse/core/tdebase/kickerrc new file mode 100644 index 000000000..e5d6351a7 --- /dev/null +++ b/opensuse/core/tdebase/kickerrc @@ -0,0 +1,63 @@ +[ServiceMenuButton_1] +Label=work/ +RelPath=work/ + +[buttons] +EnableIconZoom=false +EnableTileBackground=false + +[menus] +DetailedMenuEntries=false +ReduceMenuDepth=true +ShowUnimportantEntries=false + +[Applet_1] +DesktopFile=minipagerapplet.desktop +FreeSpace=0.25 + +[Applet_2] +ConfigFile=taskbar_panelappletrc +DesktopFile=taskbarapplet.desktop +FreeSpace=0.25 + +[Applet_3] +ConfigFile=systemtray_panelappletrc +DesktopFile=systemtrayapplet.desktop +FreeSpace=1 + +[Applet_4] +DesktopFile=clockapplet.desktop +FreeSpace=1 + +[General] +Applets=KMenuButton_1,ServiceMenuButton_1,ServiceButton_2,ServiceButton_1,ServiceButton_6,ServiceButton_3,ServiceButton_4,Applet_1,Applet_2,Applet_3,Applet_4 +CustomSize=58 +# this size gets converted to "3" via kconf_update +Size=58 + +[KFileDialog Speedbar] +Speedbar IconSize=32 + +[KMenuButton_1] +FreeSpace=0 + +[ServiceButton_1] +DesktopFile=System/konsole.desktop +FreeSpace=0 + +[ServiceButton_2] +DesktopFile=Home.desktop +FreeSpace=0 + +[ServiceButton_3] +DesktopFile=Internet/konqbrowser.desktop +FreeSpace=0 + +[ServiceButton_4] +DesktopFile=Internet/KMail.desktop +FreeSpace=0 + +[ServiceButton_6] +DesktopFile=Help.desktop +FreeSpace=0 + diff --git a/opensuse/core/tdebase/kickoff-beagle.diff b/opensuse/core/tdebase/kickoff-beagle.diff new file mode 100644 index 000000000..a850e78ce --- /dev/null +++ b/opensuse/core/tdebase/kickoff-beagle.diff @@ -0,0 +1,1329 @@ +--- configure.in.in (Revision 0) ++++ configure.in.in (Revision 849791) +@@ -0,0 +1,78 @@ ++dnl Check for pkg-config ++AC_PATH_PROG(PKG_CONFIG, pkg-config, no) ++ ++if test "$PKG_CONFIG" = "no"; then ++ AC_MSG_ERROR([ ++This package requires pkg-config. ++]) ++fi ++ ++dnl Check for Glib-2.0 ++# GLIB_CFLAGS: cflags for compiling glib dependant sources ++# GLIB_LIBADD: glib libraries (-l options) ++# GLIB_LDFLAGS: flags containing path to glib libraries (-L options) ++ ++GLIB_PACKAGES="gmodule-2.0 gthread-2.0" ++GLIB_VERSION="1.3.3" ++AC_MSG_CHECKING(for GLib-2.0 (at least $GLIB_VERSION)) ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.15 ; then ++ if $PKG_CONFIG --atleast-version $GLIB_VERSION $GLIB_PACKAGES >/dev/null 2>&1 ; then ++ GLIB_CFLAGS="`$PKG_CONFIG --cflags $GLIB_PACKAGES`" ++ GLIB_LIBADD="`$PKG_CONFIG --libs-only-l --libs-only-other $GLIB_PACKAGES`" ++ GLIB_LDFLAGS="`$PKG_CONFIG --libs-only-L $GLIB_PACKAGES`" ++ AC_MSG_RESULT(yes) ++ fi ++else ++ if $PKG_CONFIG --atleast-version $GLIB_VERSION $GLIB_PACKAGES >/dev/null 2>&1 ; then ++ GLIB_CFLAGS="`$PKG_CONFIG --cflags $GLIB_PACKAGES`" ++ GLIB_LIBADD="`$PKG_CONFIG --libs-only-l $GLIB_PACKAGES`" ++ GLIB_LDFLAGS="`$PKG_CONFIG --libs-only-L $GLIB_PACKAGES`" ++ AC_MSG_RESULT(yes) ++ AC_MSG_WARN([you may need to run make LDFLAGS=-pthread to compile arts]) ++ fi ++fi ++ ++if test -z "$GLIB_LIBADD"; then ++ AC_MSG_RESULT(not installed) ++ DO_NOT_COMPILE="$DO_NOT_COMPILE kerry gmcop" ++fi ++ ++AC_SUBST(GLIB_CFLAGS) ++AC_SUBST(GLIB_LIBADD) ++AC_SUBST(GLIB_LDFLAGS) ++ ++dnl Check for libbeagle 0.2.0 ++# LIBBEAGLE_CFLAGS: cflags for compiling libbeagle dependant sources ++# LIBBEAGLE_LIBADD: libbeagle libraries (-l options) ++# LIBBEAGLE_LDFLAGS: flags containing path to libbeagle libraries (-L options) ++ ++LIBBEAGLE_PACKAGES="libbeagle-0.0" ++LIBBEAGLE_VERSION="0.2.4" ++AC_MSG_CHECKING(for libbeagle-0.2.4 (at least $LIBBEAGLE_VERSION)) ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.15 ; then ++ if $PKG_CONFIG --atleast-version $LIBBEAGLE_VERSION $LIBBEAGLE_PACKAGES >/dev/null 2>&1 ; then ++ LIBBEAGLE_CFLAGS="`$PKG_CONFIG --cflags $LIBBEAGLE_PACKAGES`" ++ LIBBEAGLE_LIBADD="`$PKG_CONFIG --libs-only-l --libs-only-other $LIBBEAGLE_PACKAGES`" ++ LIBBEAGLE_LDFLAGS="`$PKG_CONFIG --libs-only-L $LIBBEAGLE_PACKAGES`" ++ AC_MSG_RESULT(yes) ++ fi ++else ++ if $PKG_CONFIG --atleast-version $LIBBEAGLE_VERSION $LIBBEAGLE_PACKAGES >/dev/null 2>&1 ; then ++ LIBBEAGLE_CFLAGS="`$PKG_CONFIG --cflags $LIBBEAGLE_PACKAGES`" ++ LIBBEAGLE_LIBADD="`$PKG_CONFIG --libs-only-l $LIBBEAGLE_PACKAGES`" ++ LIBBEAGLE_LDFLAGS="`$PKG_CONFIG --libs-only-L $LIBBEAGLE_PACKAGES`" ++ AC_MSG_RESULT(yes) ++ AC_MSG_WARN([you may need to run make LDFLAGS=-pthread to compile arts]) ++ fi ++fi ++ ++if test -z "$LIBBEAGLE_LIBADD"; then ++ AC_MSG_RESULT(not installed) ++ DO_NOT_COMPILE="$DO_NOT_COMPILE kerry gmcop" ++fi ++ ++AC_SUBST(LIBBEAGLE_CFLAGS) ++AC_SUBST(LIBBEAGLE_LIBADD) ++AC_SUBST(LIBBEAGLE_LDFLAGS) +--- kicker/plugins/beaglesearch.cpp (Revision 0) ++++ kicker/plugins/beaglesearch.cpp (Revision 849791) +@@ -0,0 +1,362 @@ ++/***************************************************************** ++ ++ Copyright (c) 2006 Debajyoti Bera <dbera.web@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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#include "beaglesearch.h" ++ ++#include <qdatetime.h> ++#include <qmutex.h> ++#include <qstringlist.h> ++#include <qapplication.h> ++#include <time.h> ++ ++void beagle_init () ++{ ++ g_type_init (); ++} ++ ++// ---------------- Hit --------------------------- ++ ++Hit::Hit (BeagleHit *_hit) : processed (false) ++{ ++ hit = beagle_hit_ref (_hit); ++} ++ ++Hit::~Hit () ++{ ++ beagle_hit_unref (hit); ++ if (! processed) ++ return; ++ QDictIterator<QStringList> it (property_map); ++ for( ; it.current(); ++it ) ++ ((QStringList *)it.current())->clear (); ++ ++} ++ ++void Hit::processProperties () ++{ ++ processed = true; ++ GSList *prop_list = beagle_hit_get_all_properties (hit); ++ GSList *it; ++ property_map.setAutoDelete (true); ++ for (it = prop_list; it; it = it->next) { ++ BeagleProperty *property = (BeagleProperty *) it->data; ++ QString key = QString::fromUtf8 (beagle_property_get_key (property)); ++ if (! property_map [key]) ++ property_map.insert (key, new QStringList ()); ++ property_map [key]->append (QString::fromUtf8 (beagle_property_get_value (property))); ++ } ++ g_slist_free (prop_list); ++} ++ ++const QString Hit::operator[] (QString prop_name) ++{ ++ if (! processed) ++ processProperties (); ++ ++ QStringList *prop_list = property_map [prop_name]; ++ if (! prop_list) ++ return QString::null; ++ if (prop_list->count () != 1) ++ return QString::null; ++ return (QString)prop_list->first (); ++} ++ ++// ---------------- BeagleSearch ------------------ ++ ++BeagleSearchResult::BeagleSearchResult(int client_id) ++ : client_id (client_id), total (0) ++{ ++ hitlist = new QPtrList<Hit>; ++ hitlist->setAutoDelete (true); ++} ++ ++ ++BeagleSearchResult::~BeagleSearchResult() ++{ ++ // everything is set to autodelete ++} ++ ++void BeagleSearchResult::addHit(BeagleHit *_hit) ++{ ++ Hit *hit = new Hit (_hit); ++ hitlist->prepend (hit); ++} ++ ++const QPtrList<Hit> *BeagleSearchResult::getHits () const ++{ ++ return hitlist; ++} ++ ++ ++static int total_hits; ++ ++static void print_feed_item_hit (BeagleHit *hit) ++{ ++ const char *text; ++ ++ if (beagle_hit_get_one_property (hit, "dc:title", &text)) ++ g_print ("Blog: %s\n", text); ++} ++ ++static void print_file_hit (BeagleHit *hit) ++{ ++ g_print ("File: %s, (%s)\n", beagle_hit_get_uri (hit), beagle_hit_get_mime_type (hit)); ++} ++ ++static void print_other_hit (BeagleHit *hit) ++{ ++ const char *text; ++ ++ g_print ("%s (%s)", beagle_hit_get_uri (hit), ++ beagle_hit_get_source (hit)); ++ if (beagle_hit_get_one_property (hit, "dc:title", &text)) ++ g_print ("title = %s\n", text); ++} ++ ++static void print_hit (BeagleHit *hit) ++{ ++ if (strcmp (beagle_hit_get_type (hit), "FeedItem") == 0) { ++ print_feed_item_hit (hit); ++ } ++ else if (strcmp (beagle_hit_get_type (hit), "File") == 0) { ++ print_file_hit (hit); ++ } else { ++ print_other_hit (hit); ++ } ++} ++ ++// ---------------- BeagleSearchClient ------------------ ++ ++void BeagleSearchClient::run () ++{ ++ kdDebug () << "Starting query ..." << endl; ++ ++ QTime query_timer; ++ query_timer.start (); ++ ++ g_signal_connect (query, "hits-added", ++ G_CALLBACK (hitsAddedSlot), ++ this); ++ g_signal_connect (query, "finished", ++ G_CALLBACK (finishedSlot), ++ this); ++ beagle_client_send_request_async (client, ++ BEAGLE_REQUEST (query), ++ NULL); ++ g_main_loop_run (main_loop); ++ kdDebug () << "Finished query ..." << endl; ++ ++ QCustomEvent *ev; ++ if (collate_results) { ++ result->query_msec = query_timer.elapsed (); ++ ++ ev = new QCustomEvent (RESULTFOUND, result); ++ QApplication::postEvent (object, ev); ++ } ++ ++ ev = new QCustomEvent (KILLME, this); ++ QApplication::postEvent (object, ev); ++ ++} ++ ++void BeagleSearchClient::stopClient () ++{ ++ if (finished ()) ++ return; // duh! ++ kdDebug () << "Query thread " << id << " not yet finished ..." << endl; ++ // get ready for suicide ++ client_mutex->lock (); ++ kill_me = true; ++ g_signal_handlers_disconnect_by_func ( ++ query, ++ (void *)hitsAddedSlot, ++ this); ++ g_signal_handlers_disconnect_by_func ( ++ query, ++ (void *)finishedSlot, ++ this); ++ g_main_loop_quit (main_loop); ++ client_mutex->unlock (); ++} ++ ++void BeagleSearchClient::hitsAddedSlot (BeagleQuery *query, ++ BeagleHitsAddedResponse *response, ++ BeagleSearchClient *bsclient) ++{ ++ GSList *hits, *l; ++ gint i; ++ gint nr_hits; ++ ++ // check if we are supposed to be killed ++ bsclient->client_mutex->lock (); ++ if (bsclient->kill_me) { ++ kdDebug () << "Suicide time before processing" << endl; ++ bsclient->client_mutex->unlock (); ++ return; ++ } ++ bsclient->client_mutex->unlock (); ++ ++ hits = beagle_hits_added_response_get_hits (response); ++ ++ nr_hits = g_slist_length (hits); ++ total_hits += nr_hits; ++ g_print ("Found hits (%d) at %ld:\n", nr_hits, time (NULL)); ++ ++ BeagleSearchResult *search_result; ++ if (! bsclient->collate_results) ++ search_result = new BeagleSearchResult (bsclient->id); ++ else ++ search_result = bsclient->result; ++ search_result->total += nr_hits; ++ ++ for (l = hits, i = 1; l; l = l->next, ++i) { ++ //g_print ("[%d] ", i); ++ //print_hit (BEAGLE_HIT (l->data)); ++ //g_print ("\n"); ++ ++ search_result->addHit(BEAGLE_HIT (l->data));//hit); ++ } ++ g_print ("[%ld] hits adding finished \n", time (NULL)); ++ ++ // check if we are supposed to be killed ++ bsclient->client_mutex->lock (); ++ if (bsclient->kill_me) { ++ kdDebug () << "Suicide time before sending ..." << endl; ++ bsclient->client_mutex->unlock (); ++ if (! bsclient->collate_results) ++ delete search_result; ++ return; ++ } ++ bsclient->client_mutex->unlock (); ++ ++ // time to send back results, if user asked so ++ if (bsclient->collate_results) ++ return; ++ QCustomEvent *ev = new QCustomEvent (RESULTFOUND, search_result); ++ g_print ("[%ld] event notified \n", time (NULL)); ++ QApplication::postEvent (bsclient->object, ev); ++} ++ ++void BeagleSearchClient::finishedSlot (BeagleQuery *query, ++ BeagleFinishedResponse *response, ++ BeagleSearchClient *bsclient) ++{ ++ // check if we are supposed to be killed ++ bsclient->client_mutex->lock (); ++ bool should_kill = bsclient->kill_me; ++ QObject* receiver = bsclient->object; ++ bsclient->client_mutex->unlock (); ++ ++ if (should_kill) ++ return; ++ ++ g_main_loop_quit (bsclient->main_loop); ++ ++ if (bsclient->collate_results) ++ return; // if we are collating, everything will be send from a central place ++ if (receiver) { ++ QCustomEvent *ev = new QCustomEvent (SEARCHOVER, bsclient); ++ g_print ("[%ld] query finish notified \n", time (NULL)); ++ QApplication::postEvent (receiver, ev); ++ } ++} ++ ++// ----------------- BeagleUtil ------------------- ++ ++BeagleQuery * ++BeagleUtil::createQueryFromString (QString query_str, ++ QStringList &sources_menu, ++ QStringList &types_menu, ++ int max_hits_per_source) ++{ ++ BeagleQuery *beagle_query = beagle_query_new (); ++ beagle_query_set_max_hits (beagle_query, max_hits_per_source); // this is per source! ++ ++ kdDebug () << "Creating query from \"" << query_str << "\"" << endl; ++ for ( QStringList::Iterator it = sources_menu.begin(); it != sources_menu.end(); ++it ) ++ beagle_query_add_source (beagle_query, g_strdup ((*it).utf8 ())); ++ ++ for ( QStringList::Iterator it = types_menu.begin(); it != types_menu.end(); ++it ) ++ beagle_query_add_hit_type (beagle_query, g_strdup ((*it).utf8 ())); ++ ++ QStringList query_terms; ++ QString start_date, end_date; ++ QStringList words = QStringList::split (' ', query_str, false); ++ for ( QStringList::Iterator it = words.begin(); it != words.end(); ++it ) { ++ QStringList key_value_pair = QStringList::split ('=', *it, false); ++ if (key_value_pair.count () == 1) ++ query_terms += *it; ++ else if (key_value_pair.count () == 2) { ++ QString key = key_value_pair [0].lower (); ++ QString value = key_value_pair [1]; ++ if (key == "mime") ++ beagle_query_add_mime_type (beagle_query, g_strdup (value.utf8 ())); ++ else if (key == "type") ++ beagle_query_add_hit_type (beagle_query, g_strdup (value.utf8 ())); ++ else if (key == "source") ++ beagle_query_add_source (beagle_query, g_strdup (value.utf8 ())); ++ else if (key == "start") ++ start_date = value; ++ else if (key == "end") ++ end_date = value; ++ else ++ query_terms += *it; ++ } else ++ query_terms += *it; ++ } ++ ++ beagle_query_add_text (beagle_query, g_strdup (query_terms.join (" ").utf8 ())); ++ kdDebug () << "Adding query text:" << query_terms.join (" ").utf8 () << endl; ++ ++ if (start_date.isNull () && end_date.isNull ()) ++ return beagle_query; ++ ++ //kdDebug () << "Handling dates ..." << endl; ++ BeagleQueryPartDate * date_part = beagle_query_part_date_new (); ++ if (! start_date.isNull ()) ++ beagle_query_part_date_set_start_date (date_part, timestringToBeagleTimestamp (start_date)); ++ if (! end_date.isNull ()) ++ beagle_query_part_date_set_end_date (date_part, timestringToBeagleTimestamp (end_date)); ++ beagle_query_add_part (beagle_query, BEAGLE_QUERY_PART (date_part)); ++ ++ return beagle_query; ++} ++ ++// timestring format allowed YYYYmmDD ++BeagleTimestamp * ++BeagleUtil::timestringToBeagleTimestamp(QString timestring) ++{ ++ //kdDebug () << "datetime string:" << timestring << endl; ++ // FIXME: error check timestring format ++ if (timestring.isNull () || timestring.stripWhiteSpace () == "" || timestring.length() != 8 ) ++ return beagle_timestamp_new_from_unix_time (QDateTime::currentDateTime ().toTime_t ()); ++ //QDateTime dt = QDateTime::fromString (timestring, Qt::ISODate); ++ struct tm tm_time; ++ time_t timet_time; ++ time (&timet_time); ++ localtime_r (&timet_time, &tm_time); ++ strptime (timestring.ascii(), "%Y%m%d", &tm_time); ++ tm_time.tm_sec = tm_time.tm_min = tm_time.tm_hour = 0; ++ //kdDebug() << asctime (&tm_time) << endl; ++ timet_time = mktime (&tm_time); ++ return beagle_timestamp_new_from_unix_time (timet_time); ++} ++ +--- kicker/plugins/kickoff-beagle-plugin.cpp (Revision 0) ++++ kicker/plugins/kickoff-beagle-plugin.cpp (Revision 849791) +@@ -0,0 +1,499 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * Copyright (c) 2006 Debajyoti Bera <dbera.web@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 "kickoff-beagle-plugin.h" ++ ++#include <qregexp.h> ++#include <qtimer.h> ++ ++#include <kapplication.h> ++#include <kdesktopfile.h> ++#include <kgenericfactory.h> ++#include <kservice.h> ++ ++QString dc_identifier = "dc:identifier"; ++QString dc_title = "dc:title"; ++QString parent_dc_title = "parent:dc:title"; ++QString exactfilename = "beagle:ExactFilename"; ++QString fixme_name = "fixme:Name"; ++QString beagle_filename = "beagle:Filename"; ++QString fixme_attachment_title = "fixme:attachment_title"; ++QString fixme_hasattachments = "fixme:hasAttachments"; ++QString parent_prefix = "parent:"; ++QString fixme_folder = "fixme:folder"; ++QString fixme_categories = "fixme:Categories"; ++QString fixme_comment = "fixme:Comment"; ++QString fixme_width = "fixme:width"; ++QString fixme_height = "fixme:height"; ++QString fixme_from_address = "fixme:from_address"; ++QString fixme_artist = "fixme:artist"; ++QString fixme_album = "fixme:album"; ++QString dc_source = "dc:source"; ++QString dc_publisher = "dc:publisher"; ++QString digikam_tag = "digikam:Tag"; ++QString fixme_speakingto = "fixme:speakingto"; ++QString fixme_starttime = "fixme:starttime"; ++QString comma_string = ","; ++QString vCard_FN = "vCard:FN"; ++QString vCard_PREFEMAIL = "vCard:PREFEMAIL"; ++QString fixme_uid = "fixme:uid"; ++ ++static CATEGORY getHitCategory (Hit *hit) ++{ ++ QString hittype = hit->getType(); ++ QString hitsource = hit->getSource(); ++ ++ // if hit source is None, dont handle it. Might be anthrax-envelope :) ++ if (hitsource.isNull()) ++ return OTHER; ++ ++ if (hitsource == "documentation") ++ return DOCS; ++ ++ if (hittype == "IMLog") ++ return CHATS; ++ ++ // sure shots ++ if (hittype == "FeedItem") ++ return FEEDS; ++ if (hittype == "WebHistory") ++ return WEBHIST; ++ if (hittype == "MailMessage") ++ return MAILS; ++ if (hittype == "Note") ++ return NOTES; ++ ++ // check for applications ++ if (hittype == "File" && (*hit) ["beagle:FilenameExtension"] == ".desktop") ++ return APPS; ++ ++ // check for music ++ QString hitmimetype = hit->getMimeType(); ++ if (hitsource == "Amarok" ++ || hitmimetype.startsWith ("audio") ++ || hitmimetype == "application/ogg") ++ return MUSIC; // not an exhaustive search ++ ++ // check for images from files ++ if (hitsource == "Files" && hitmimetype.startsWith ("image")) ++ return PICS; ++ ++ if (hitsource == "Files" && hitmimetype.startsWith ("video")) ++ return VIDEOS; ++ ++ if (hitsource == "Files") ++ return FILES; ++ ++ if (hitsource == "KAddressBook") ++ return ACTIONS; ++ ++ return OTHER; ++} ++ ++K_EXPORT_COMPONENT_FACTORY( kickoffsearch_beagle, ++ KGenericFactory<KickoffBeaglePlugin>( "kickoffsearch_beagle" ) ) ++ ++KickoffBeaglePlugin::KickoffBeaglePlugin(QObject *parent, const char* name, const QStringList&) ++ : KickoffSearch::Plugin(parent, name ), genericTitle( true ) ++{ ++ g_type_init (); ++ current_beagle_client = NULL; ++} ++ ++bool KickoffBeaglePlugin::daemonRunning() ++{ ++ return beagle_util_daemon_is_running(); ++} ++ ++void KickoffBeaglePlugin::query(QString term, bool _genericTitle) ++{ ++ genericTitle = _genericTitle; ++ current_query_str = term; ++ ++ // Beagle search ++ if (current_beagle_client != NULL) { ++ kdDebug () << "Previous client w/id " << current_beagle_client->id << " still running ... ignoring it." << endl; ++ current_beagle_client->stopClient (); ++ } ++ current_beagle_client_id = KApplication::random (); ++ kdDebug () << "Creating client with id:" << current_beagle_client_id << endl; ++ ++ BeagleClient *beagle_client = beagle_client_new (NULL); ++ if (beagle_client == NULL) { ++ kdDebug() << "beagle service not running ..." << endl; ++ return; ++ } ++ ++ QStringList sources, types; ++ BeagleQuery *beagle_query = BeagleUtil::createQueryFromString (term, sources, types, 99); // maximum 99 results, if this doesnt work, blame the stars ++ ++ current_beagle_client = new BeagleSearchClient ( ++ current_beagle_client_id, ++ this, ++ beagle_client, ++ beagle_query, ++ false); ++ current_beagle_client->start(); ++// kdDebug () << "Query dispatched at " << time (NULL) << endl; ++} ++ ++void KickoffBeaglePlugin::cleanClientList () ++{ ++ toclean_list_mutex.lock (); ++ BeagleSearchClient *old_client = toclean_client_list.take (0); ++ if (old_client != NULL) { // failsafe ++ kdDebug () << "Cleanup old client " << old_client->id << endl; ++ delete old_client; ++ } ++ toclean_list_mutex.unlock (); ++} ++ ++void KickoffBeaglePlugin::customEvent (QCustomEvent *e) ++{ ++ if (e->type () == RESULTFOUND) { ++// kdDebug () << "Quick query thread at " << time (NULL) << " with current_id=" << current_beagle_client_id << " finished ..." << endl; ++ BeagleSearchResult *result = (BeagleSearchResult *) e->data (); ++ if (current_beagle_client_id != result->client_id) { ++ kdDebug () << "Stale result from " << result->client_id << endl; ++ delete result; ++ // FIXME: Should I also free e ? ++ } else { ++ kdDebug () << "Good results ...total=" << result->total << endl; ++ showResults (result); ++ } ++ //KPassivePopup::message( "This is the message", this ); ++ } else if (e->type () == SEARCHOVER) { ++ BeagleSearchClient *client = (BeagleSearchClient *) e->data (); ++ if (client == NULL) { ++// kdDebug () << "Query finished event at " << time (NULL) << " but client is already deleted" << endl; ++ return; ++ } ++// kdDebug () << "Query finished event at " << time (NULL) << " for id=" << client->id << endl; ++ if (current_beagle_client_id == client->id) { ++ kickoffSearchInterface()->searchOver(); ++ current_beagle_client = NULL; // important ! ++ } ++ } else if (e->type () == KILLME) { ++ BeagleSearchClient *client = (BeagleSearchClient *) e->data (); ++ if (client->finished ()) ++ delete client; ++ else { ++ // add client to cleanup list ++ toclean_list_mutex.lock (); ++ toclean_client_list.append (client); ++ kdDebug () << "Scheduling client to be deleted in 500ms" << endl; ++ toclean_list_mutex.unlock (); ++ QTimer::singleShot (500, this, SLOT (cleanClientList ())); ++ } ++ } ++} ++ ++// this method decides what to display in the result list ++HitMenuItem *KickoffBeaglePlugin::hitToHitMenuItem (int category, Hit *hit) ++{ ++ QString title, info, mimetype, icon; ++ int score = 0; ++ KURL uri; ++ ++#if 0 ++ kdDebug() << "*** " << hit->getUri() << endl; ++ QDict<QStringList> all = hit->getAllProperties(); ++ QDictIterator<QStringList> it( all ); ++ for( ; it.current(); ++it ) ++ kdDebug() << it.currentKey() << ": " << *(it.current()) << endl; ++#endif ++ ++ switch (category) { ++ case FILES: ++ { ++ uri = hit->getUri (); ++ QString uristr = uri.path (); ++ title = (*hit) [exactfilename]; ++ int last_slash = uristr.findRev ('/', -1); ++ info = i18n("Folder: %1").arg(last_slash == 0 ? "/" ++ : uristr.section ('/', -2, -2)); ++ } ++ break; ++ case ACTIONS: ++ { ++ if (hit->getSource()=="KAddressBook"){ ++ title = i18n("Send Email to %1").arg((*hit)[vCard_FN]); ++ info = (*hit)[vCard_PREFEMAIL]; ++ uri = "mailto:"+(*hit)[vCard_PREFEMAIL]; ++ mimetype = hit->getMimeType (); ++ icon = "mail_new"; ++ ++ HitMenuItem * first_item=new HitMenuItem (title, info, uri, mimetype, 0, category, icon, score); ++ kickoffSearchInterface()->addHitMenuItem(first_item); ++ ++ title =i18n("Open Addressbook at %1").arg((*hit)[vCard_FN]); ++ uri = "kaddressbook:/"+(*hit)[fixme_uid]; ++ icon = "kaddressbook"; ++ } ++ break; ++ } ++ case MAILS: ++ { ++ QString prefix = QString::null; ++ bool is_attachment = ((*hit) [parent_prefix + fixme_hasattachments] == "true"); ++ bool has_parent = (! hit->getParentUri ().isEmpty ()); ++ bool parent_mbox_file = false; ++ if (has_parent) ++ parent_mbox_file = ((*hit) [parent_prefix + fixme_folder] == QString::null); ++ ++ // Logic: ++ // If has_parent == false, everything is normal ++ // If has_parent == true, parent_mbox_file == false, everything is normal, use uri ++ // FIXME: If has_parent == true, parent_mbox_file == true, ??? ++ // If has_parent == true, is_attachment == true, hit is attach and access with prefix "parent:", use parenturi ++ // Else, not attachment (multipart), access with prefix "parent:", use parenturi ++ ++ if (has_parent && !parent_mbox_file) { ++ uri = hit->getParentUri (); ++ prefix = parent_prefix; ++ if (is_attachment) ++ title = (*hit) [fixme_attachment_title]; ++ if (title.isEmpty ()) ++ title = (*hit) [prefix + dc_title]; ++ if (title.isEmpty ()) ++ title = i18n("No subject"); ++ if (is_attachment) ++ title = title.prepend (i18n("(Attachment) ")); ++ info = (i18n("From %1").arg((*hit) [prefix + fixme_from_address])); ++ } else { ++ uri = hit->getUri (); ++ title = (*hit) [dc_title]; ++ info = (i18n("From %1").arg((*hit) [fixme_from_address])); ++ } ++ } ++ mimetype = "message/rfc822"; // to handle attachment results ++ break; ++ case MUSIC: ++ uri = hit->getUri (); ++ title = (*hit) [exactfilename]; ++ { ++ QString artist = (*hit) [fixme_artist]; ++ QString album = (*hit) [fixme_album]; ++ if (! artist.isEmpty ()) ++ info = (i18n("By %1").arg(artist)); ++ else if (! album.isEmpty ()) ++ info = (i18n("From Album %1").arg(album)); ++ else { ++ QString uristr = uri.path (); ++ int last_slash = uristr.findRev ('/', -1); ++ info = i18n("Folder: %1") ++ .arg(last_slash == 0 ? "/" : uristr.section ('/', -2, -2)); ++ } ++ } ++ break; ++ case VIDEOS: ++ uri = hit->getUri (); ++ title = (*hit) [exactfilename]; ++ { ++ QString uristr = uri.path (); ++ int last_slash = uristr.findRev ('/', -1); ++ info = i18n("Folder: %1").arg(last_slash == 0 ? "/" : uristr.section ('/', -2, -2)); ++ } ++ break; ++ case WEBHIST: ++ uri = hit->getUri (); ++ title = (*hit) [dc_title]; ++ title = title.replace(QRegExp("\n")," "); ++ mimetype = "text/html"; ++ if (title.isEmpty () || title.stripWhiteSpace ().isEmpty ()) { ++ title = uri.prettyURL (); ++ } else { ++ info = uri.host () + uri.path (); ++ } ++ break; ++ case FEEDS: ++ { ++ uri = KURL ((*hit) [dc_identifier]); ++ title = (*hit) [dc_title]; ++ mimetype = "text/html"; ++ QString publisher = (*hit) [dc_publisher]; ++ QString source = (*hit) [dc_source]; ++ if (! publisher.isEmpty ()) ++ info = publisher; ++ else if (! source.isEmpty ()) ++ info = source; ++ } ++ break; ++ case PICS: ++ { ++ uri = hit->getUri (); ++ title = (*hit) [exactfilename]; ++ QString width = (*hit) [fixme_width]; ++ QString height = (*hit) [fixme_height]; ++ if (width.isEmpty () || height.isEmpty ()) { ++ QString uristr = uri.path (); ++ int last_slash = uristr.findRev ('/', -1); ++ info = i18n("Folder: %1") ++ .arg(last_slash == 0 ? "/" : uristr.section ('/', -2, -2)); ++ break; ++ } ++ info = (QString (" (%1x%2)").arg (width).arg (height)); ++ const QStringList *tags = hit->getProperties (digikam_tag); ++ if (tags == NULL) ++ break; ++ QString tags_string = tags->join (comma_string); ++ info += (" " + tags_string); ++ } ++ break; ++ case APPS: ++ { ++ uri = hit->getUri (); ++ title = (*hit) [dc_title]; ++ KDesktopFile desktopfile(uri.path(),true); ++ if (genericTitle && !desktopfile.readGenericName().isEmpty()) { ++ title = desktopfile.readGenericName(); ++ info = desktopfile.readName(); ++ } ++ else { ++ title = desktopfile.readName(); ++ info = desktopfile.readGenericName(); ++ } ++ icon = desktopfile.readIcon(); ++ QString input = current_query_str.lower(); ++ QString command = desktopfile.readEntry("Exec"); ++ if (command==input) ++ score = 100; ++ else if (command.find(input)==0) ++ score = 50; ++ else if (command.find(input)!=-1) ++ score = 10; ++ else if (title==input) ++ score = 100; ++ else if (title.find(input)==0) ++ score = 50; ++ else if (title.find(input)!=-1) ++ score = 10; ++ break; ++ } ++ break; ++ case NOTES: ++ { ++ uri = hit->getUri (); ++ title = (*hit) [dc_title]; ++ title = i18n("Title: %1").arg(title.isEmpty() ? i18n("Untitled") : title); ++ ++ if (hit->getSource()=="KNotes") ++ icon="knotes"; ++ else ++ icon="contents2"; ++ } ++ break; ++ case CHATS: ++ { ++ uri = hit->getUri (); ++ title = (*hit) [fixme_speakingto]; ++ title = i18n("Conversation With %1").arg(title.isEmpty() ? i18n("Unknown Person") : title); ++ QDateTime datetime; ++ datetime = datetimeFromString((*hit) [fixme_starttime]); ++ info=i18n("Date: %1").arg(KGlobal::locale()->formatDateTime(datetime,false)); ++ if (hit->getMimeType()=="beagle/x-kopete-log") ++ icon="kopete"; ++ else ++ icon="gaim"; ++ } ++ break; ++ case DOCS: ++ { ++ uri = hit->getUri (); ++ title = (*hit) [dc_title]; ++ if (title.isEmpty () || title.stripWhiteSpace ().isEmpty ()) ++ title = uri.prettyURL (); ++ else { ++ QString uristr = uri.path (); ++ int last_slash = uristr.findRev ('/', -1); ++ info = i18n("Folder: %1").arg(last_slash == 0 ? "/" : uristr.section ('/', ++ -2, -2)); ++ } ++ } ++ break; ++ default: ++ return NULL; ++ } ++ if (mimetype.isEmpty ()) ++ mimetype = hit->getMimeType (); ++ return new HitMenuItem (title, info, uri, mimetype, 0, category, icon, score); ++} ++ ++void KickoffBeaglePlugin::showResults(BeagleSearchResult *result) ++{ ++ if (result->total == 0 ) { ++ // Dont report error from here ... ++ kdDebug() << "No matches found" << endl; ++ delete result; ++ return; ++ } ++ ++ const QPtrList<Hit> *hits = result->getHits(); ++ if (hits == NULL) { ++ kdDebug () << "Hmm... null" << endl; ++ delete result; ++ return; ++ } ++ kickoffSearchInterface()->initCategoryTitlesUpdate(); ++ ++ QPtrListIterator<Hit> it (*hits); ++ Hit *hit; ++ for (; (hit = it.current ()) != NULL; ++it) { ++ CATEGORY category = getHitCategory (hit); ++ ++ // if category is not handled, continue ++ if (category == OTHER) ++ continue; ++ ++ if ( category == APPS ) { ++ // we need to check if this is useful ++ KService cs( hit->getUri().path() ); ++ if ( cs.noDisplay() ) ++ continue; ++ } ++ ++ if (!kickoffSearchInterface()->anotherHitMenuItemAllowed(category)) ++ continue; ++ ++ HitMenuItem *hit_item = hitToHitMenuItem (category, hit); ++ ++ if (!hit_item) ++ continue; ++ ++ kickoffSearchInterface()->addHitMenuItem(hit_item); ++ } ++ ++ kickoffSearchInterface()->updateCategoryTitles(); ++ ++ delete result; ++} ++ ++QDateTime KickoffBeaglePlugin::datetimeFromString( const QString& s) ++{ ++ int year( s.mid( 0, 4 ).toInt() ); ++ int month( s.mid( 4, 2 ).toInt() ); ++ int day( s.mid( 6, 2 ).toInt() ); ++ int hour( s.mid( 8, 2 ).toInt() ); ++ int min( s.mid( 10, 2 ).toInt() ); ++ int sec( s.mid( 12, 2 ).toInt() ); ++ return QDateTime(QDate(year,month,day),QTime(hour,min,sec)); ++} ++ ++#include "kickoff-beagle-plugin.moc" +--- kicker/plugins/Makefile.am (Revision 0) ++++ kicker/plugins/Makefile.am (Revision 849791) +@@ -0,0 +1,24 @@ ++INCLUDES = -I$(top_srcdir)/interfaces $(all_includes) $(LIBBEAGLE_CFLAGS) $(GLIB_CFLAGS) ++METASOURCES = AUTO ++ ++# Install this plugin in the KDE modules directory ++kde_module_LTLIBRARIES = kickoffsearch_beagle.la ++ ++# Srcs for the plugin ++kickoffsearch_beagle_la_SOURCES = kickoff-beagle-plugin.cpp beaglesearch.cpp ++ ++# Libs needed by the plugin ++kickoffsearch_beagle_la_LIBADD = $(LIB_KPARTS) ../interfaces/libkickoffsearch_interfaces.la \ ++ $(LIBBEAGLE_LIBADD) $(GLIB_LIBADD) ++ ++# LD flags for the plugin ++# -module says: this is a module, i.e. something you're going to dlopen ++# so e.g. it has no version number like a normal shared lib would have. ++kickoffsearch_beagle_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) ++ ++# Install the desktop file needed to detect the plugin ++kde_services_DATA = kickoffsearch_beagle.desktop ++ ++# i18n translation messages ++messages: rc.cpp ++ $(XGETTEXT) *.cpp *.h -o $(podir)/kickoffsearch_beagle.pot +--- kicker/plugins/kickoffsearch_beagle.desktop (Revision 0) ++++ kicker/plugins/kickoffsearch_beagle.desktop (Revision 849791) +@@ -0,0 +1,6 @@ ++[Desktop Entry] ++Name=Beagle Search ++Comment=Beagle search plugin for Kickoff search ++ServiceTypes=KickoffSearch/Plugin ++Type=Service ++X-KDE-Library=kickoffsearch_beagle +--- kicker/plugins/beaglesearch.h (Revision 0) ++++ kicker/plugins/beaglesearch.h (Revision 849791) +@@ -0,0 +1,234 @@ ++/***************************************************************** ++ ++ Copyright (c) 2006 Debajyoti Bera <dbera.web@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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#ifndef BEAGLESEARCH_H ++#define BEAGLESEARCH_H ++ ++#include <qdict.h> ++#include <qptrlist.h> ++#include <qthread.h> ++#include <qevent.h> ++#include <qmutex.h> ++ ++#include <kdebug.h> ++#include <kurl.h> ++ ++extern "C" { ++#include <glib.h> ++#include <beagle/beagle.h> ++} ++ ++// BeagleSearchClient sends 3 types of events ++// when results are to be sent as they arrive, ++// - RESULTFOUND : when result is found ++// - SEARCHOVER : when search is over ++// - KILLME : just before thread finishes - used to cleanup the thread object ++// when results are to be sent after receiving all of them ++// - RESULTFOUND : when all results are obtained ++// - KILLME : just before thread finishes - used to cleanup the thread object ++#define RESULTFOUND (QEvent::Type)1001 /* QEvent::User + 1 */ ++#define SEARCHOVER (QEvent::Type)1002 /* QEvent::User + 2 */ ++#define KILLME (QEvent::Type)1003 /* QEvent::User + 3 */ ++ ++class QStringList; ++ ++// IMPORTANT: Call this before any beagle calls ++void beagle_init (); ++ ++class Hit { ++public: ++ Hit (BeagleHit *_hit); ++ ~Hit (); ++ ++ // convenience wrappers ++ // remember that the hit values are utf8 strings ++ const KURL getUri () const { return KURL (QString::fromUtf8 (beagle_hit_get_uri (hit)));} ++ const QString getType () const { return QString::fromUtf8 (beagle_hit_get_type (hit));} ++ const QString getMimeType () const { return QString::fromUtf8 (beagle_hit_get_mime_type (hit));} ++ const QString getSource () const { return QString::fromUtf8 (beagle_hit_get_source (hit));} ++ const KURL getParentUri () const { return KURL (QString::fromUtf8 (beagle_hit_get_parent_uri (hit)));} ++ const QDict<QStringList>& getAllProperties () ++ { ++ if (! processed) ++ processProperties (); ++ return property_map; ++ } ++ const QStringList* getProperties (QString prop_name) ++ { ++ if (! processed) ++ processProperties (); ++ return property_map [prop_name]; ++ } ++ const QString operator[] (QString prop_name); ++ ++private: ++ BeagleHit *hit; ++ QDict<QStringList> property_map; ++ // not every hit may be used. so, do a lazy processing of property_map ++ bool processed; ++ void processProperties (); ++}; ++ ++class BeagleSearchResult{ ++public: ++ BeagleSearchResult(int client_id); ++ ~BeagleSearchResult(); ++ void addHit (BeagleHit *hit); ++ QString getHitCategory (Hit *hit); ++ ++ // id of the bsclient ++ int client_id; ++ // time taken to finish query ++ int query_msec; ++ // total number of results in this query ++ int total; ++ ++ const QPtrList<Hit> *getHits () const; ++ ++private: ++ // lists of hits ++ QPtrList<Hit> *hitlist; ++}; ++ ++// caller should delete bsclient->result and bsclient ++class BeagleSearchClient : public QThread { ++public: ++ // passing NULL for client makes bsclient create client itself and ++ // delete it later ++ BeagleSearchClient (int id, ++ QObject *y, ++ BeagleClient *client, ++ BeagleQuery *query, ++ bool collate_results) ++ : id (id), kill_me (false), object (y), client (client), ++ query (query), destroy_client (false), collate_results (collate_results) ++ { ++ if (client == NULL) { ++ client = beagle_client_new (NULL); ++ destroy_client = true; ++ } ++ ++// if (client == NULL) ++// throw -1; ++ ++ main_loop = g_main_loop_new (NULL, FALSE); ++ if (collate_results) ++ result = new BeagleSearchResult (id); ++ ++ client_mutex = new QMutex (); ++ } ++ ++ // It is never safe to delete BeagleSearchClient directly, the thread might still be running ++ ~BeagleSearchClient () ++ { ++ if (! finished ()) { ++ kdDebug () << "Thread " << id << " still running. Waiting.........." << endl; ++ wait (); ++ } ++ ++ if (destroy_client) ++ g_object_unref (client); ++ g_main_loop_unref (main_loop); ++ g_object_unref (query); ++ kdDebug() << "Deleting client ..." << id << endl; ++ delete client_mutex; ++ } ++ ++private: ++ static void hitsAddedSlot (BeagleQuery *query, ++ BeagleHitsAddedResponse *response, ++ BeagleSearchClient *bsclient); ++ ++ static void finishedSlot (BeagleQuery *query, ++ BeagleFinishedResponse *response, ++ BeagleSearchClient *bsclient); ++ ++public: ++ // run() starts the query and sends the result as follows: ++ // - either wait till get back all results and send it as RESULTFOUND ++ // - or, send results as it gets them as RESULTFOUND and ++ // send SEARCHOVER when finished ++ // collate_results controls the behaviour ++ virtual void run ( ); ++ ++ // after stopClient() is called, application can safely go and remove previous menu entries ++ // - i.e. after stopClient is called, app doesnt except the eventhandler to receive any results ++ // - use client_id to determine which is the current client, set it right after stopclient ++ // - Eventhandler checks client id, if it is current, it adds stuff to the menu ++ // else, it discards everything ++ // Once eventhandler is being processed, doQuery() wont be called and vice versa ++ // so no need to serialize eventhandler and doquery ++ // ++ // stopClient needs to make sure that once it is called, the thread is finished asap. Use a mutex ++ // to serialize actions. callbacks need to use mutex too. ++ // stopclient has to remove signal handlers to prevent further signal calls, set kill_me flag ++ // and quite main loop ++ // stopClient can be called at the following times: ++ // - Waiting for the first result: ++ // nothing extra ++ // - in hitsAddedSlot, processing results ++ // in callback, before processing, if killme is set, just return. ++ // - in hitsAddedSlot, after sending results ++ // before sending, if killme is set, dont send results ++ // (doing it twice in hitsAdded because forming BeagleSearchResult can take time) ++ // - Waiting for more results ++ // nothing extra ++ // - in finishedSlot, before sending finishedMsg ++ // if killme is set, just return ++ // - in finishedSlot, after sending finishedMsg ++ // if killme is set, just return ++ // in Run(), when return from mainloop, if killme is set, dont do anything more but call delete this ++ void stopClient (); ++ ++ // id of the client ++ // this is required in case applications fires many clients in rapid succession ++ int id; ++ ++ GMainLoop * main_loop; ++ BeagleSearchResult *result; ++ ++ // this is set if the client is obsolete now i.e. ++ // the application doesnt need the results from the client anymore ++ bool kill_me; ++private: ++ // the application; need this to send events to the application ++ QObject *object; ++ // mutex to control setting the kill_me shared variable ++ QMutex *client_mutex; ++ BeagleClient *client; ++ BeagleQuery *query; ++ // should the client be destroyed by the client ++ // if the client created it, then most probably it should ++ bool destroy_client; ++ bool collate_results; ++}; ++ ++class BeagleUtil { ++public: ++ ++ static BeagleQuery *createQueryFromString (QString query_str, ++ QStringList &sources, ++ QStringList &types, ++ int max_hits_per_source = 100); ++ static BeagleTimestamp *timestringToBeagleTimestamp (QString timestring); ++}; ++ ++#endif +--- kicker/plugins/kickoff-beagle-plugin.h (Revision 0) ++++ kicker/plugins/kickoff-beagle-plugin.h (Revision 849791) +@@ -0,0 +1,64 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * Copyright (c) 2006 Debajyoti Bera <dbera.web@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. * ++ ***************************************************************************/ ++ ++#ifndef CAPITALIZEPLUGIN_H ++#define CAPITALIZEPLUGIN_H ++ ++#include "../interfaces/kickoff-search-plugin.h" ++#include "beaglesearch.h" ++ ++class KickoffBeaglePlugin :public KickoffSearch::Plugin ++{ ++ Q_OBJECT ++ ++public: ++ KickoffBeaglePlugin(QObject *parent, const char* name, const QStringList&); ++ ++ void query(QString, bool); ++ bool daemonRunning(); ++ ++protected slots: ++ // to clean beaglesearchclients ++ void cleanClientList (); ++ ++private: ++ QString current_query_str; ++ ++ // all beagle activity is done through the BSC object ++ BeagleSearchClient *current_beagle_client; ++ ++ // used to send notification from the beagle thread to the main event loop ++ virtual void customEvent (QCustomEvent *e); ++ ++ QPtrList<BeagleSearchClient> toclean_client_list; ++ QMutex toclean_list_mutex; ++ ++ // show the results ++ void showResults (BeagleSearchResult *); ++ HitMenuItem *hitToHitMenuItem (int category, Hit *hit); ++ ++ // use a different id for each bsc client, and use that to separate stale responses from current ones ++ int current_beagle_client_id; ++ ++ bool genericTitle; ++ QDateTime datetimeFromString( const QString& ); ++}; ++ ++#endif /* CAPITALIZEPLUGIN_H */ + +Eigenschaftsänderungen: kicker/plugins +___________________________________________________________________ +Hinzugefügt: svn:ignore + + .deps +kickoffsearch_beagle.la +.libs +Makefile +Makefile.in +*.moc + + +--- kicker/Makefile.am 2010/08/10 08:10:21 1.1 ++++ kicker/Makefile.am 2010/08/10 08:10:33 +@@ -1,6 +1,6 @@ + INCLUDES = $(all_includes) + +-SUBDIRS = core ui buttons interfaces . ++SUBDIRS = core ui buttons interfaces plugins . + + bin_PROGRAMS = + lib_LTLIBRARIES = +--- kicker/core/Makefile.am 2010/08/10 08:15:06 1.2 ++++ kicker/core/Makefile.am 2010/08/10 08:17:08 +@@ -1,6 +1,6 @@ + INCLUDES = -I$(srcdir)/../../libkicker -I../../libkicker \ + -I../ui -I$(srcdir)/../ui -I$(srcdir)/../buttons -I$(top_srcdir)/libkonq \ +- $(all_includes) ++ $(all_includes) $(LIBBEAGLE_CFLAGS) $(GLIB_CFLAGS) + + noinst_LTLIBRARIES = libkicker_core.la + +--- kicker/buttons/Makefile.am 2010/08/10 08:16:06 1.1 ++++ kicker/buttons/Makefile.am 2010/08/10 08:16:28 +@@ -1,5 +1,5 @@ + INCLUDES = -I$(srcdir)/../core -I$(srcdir)/../../libkicker -I../../libkicker \ +- -I../ui -I$(srcdir)/../ui -I$(top_srcdir)/libkonq $(all_includes) ++ -I../ui -I$(srcdir)/../ui -I$(top_srcdir)/libkonq $(all_includes) $(LIBBEAGLE_CFLAGS) $(GLIB_CFLAGS) + + noinst_LTLIBRARIES = libkicker_buttons.la + diff --git a/opensuse/core/tdebase/kickoff-data.tar.bz2 b/opensuse/core/tdebase/kickoff-data.tar.bz2 Binary files differnew file mode 100644 index 000000000..9841a0aa0 --- /dev/null +++ b/opensuse/core/tdebase/kickoff-data.tar.bz2 diff --git a/opensuse/core/tdebase/kickoff-install-software.diff b/opensuse/core/tdebase/kickoff-install-software.diff new file mode 100644 index 000000000..f053a45fb --- /dev/null +++ b/opensuse/core/tdebase/kickoff-install-software.diff @@ -0,0 +1,25 @@ +--- kicker/kicker/ui/k_new_mnu.cpp 2007/08/08 15:14:50 1.141 ++++ kicker/kicker/ui/k_new_mnu.cpp 2007/08/08 15:39:58 +@@ -1345,6 +1345,9 @@ + KService::Ptr p = KService::serviceByStorageId("/usr/share/applications/YaST.desktop"); + m_systemView->insertMenuItem(p, nId++, index++); + ++ p = KService::serviceByStorageId("/usr/share/applications/package-manager.desktop"); ++ m_systemView->insertMenuItem(p, nId++, index++); ++ + m_systemView->insertItem( "info", i18n( "System Information" ), + "sysinfo:/", "sysinfo:/", nId++, index++ ); + +--- kicker/kicker/ui/itemview.cpp 2007/08/08 15:14:50 1.141 ++++ kicker/kicker/ui/itemview.cpp 2007/08/08 15:59:35 +@@ -139,7 +139,9 @@ + void KMenuItem::setIcon(const QString& icon, int size) + { + m_icon = icon; +- QListViewItem::setPixmap(0, KGlobal::iconLoader()->loadIcon(icon, KIcon::Panel, size )); ++ QPixmap pixmap = KGlobal::iconLoader()->loadIcon(icon, KIcon::Panel, size, KIcon::DefaultState, 0L, true); ++ if (!pixmap.isNull()) ++ QListViewItem::setPixmap(0, pixmap); + } + + void KMenuItem::setHasChildren( bool flag ) diff --git a/opensuse/core/tdebase/kickoff-kcm.diff b/opensuse/core/tdebase/kickoff-kcm.diff new file mode 100644 index 000000000..1dd87afde --- /dev/null +++ b/opensuse/core/tdebase/kickoff-kcm.diff @@ -0,0 +1,217 @@ +--- menutab_impl.h (revision 755866) ++++ menutab_impl.h (revision 774645) +@@ -62,6 +62,7 @@ signals: + + public slots: + void launchMenuEditor(); ++ void menuStyleChanged(); + + protected: + kSubMenuItem *m_bookmarkMenu; +--- kicker_config_hiding.desktop (revision 755866) ++++ kicker_config_hiding.desktop (revision 774645) +@@ -146,7 +146,7 @@ Keywords[csb]=kicker,panel,kpanel,lëstà + Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo + Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,hÃ¥ndterer,ikoner + Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole +-Keywords[el]=kicker,πίνακας,kpanel,γÏαμμή εÏγασιών,γÏαμμή ÎναÏξης,γÏαμμή εκκίνησης,τοποθεσία,μÎγεθος,αυτόματη απόκÏυψη,απόκÏυψη,κουμπιά,εφΠκίνησης,φόντο,θÎματα,λανθάνουσα μνήμη μενοÏ,λανθάνουσα μνήμη,κÏυφό, K-ΜενοÏ,σελιδοδείκτες,Ï€Ïόσφατα ÎγγÏαφα,γÏήγοÏος εξεÏευνητής,Î¼ÎµÎ½Î¿Ï ÎµÎ¾ÎµÏευνητή,μενοÏ,εικονίδια,tiles,μικÏοεφαÏμογÎÏ‚,ÎναÏξη,τονισμός,χειÏιστήÏια, μεγÎθυνση εικονιδίων ++Keywords[el]=kicker,πίνακας,kpanel,γÏαμμή εÏγασιών,γÏαμμή ÎναÏξης,γÏαμμή εκκίνησης,τοποθεσία,μÎγεθος,αυτόματη απόκÏυψη,απόκÏυψη,κουμπιά,εφΠκίνησης,φόντο,θÎματα,λανθάνουσα μνήμη μενοÏ,λανθάνουσα μνήμη,κÏυφό, K-ΜενοÏ,σελιδοδείκτες,Ï€Ïόσφατα ÎγγÏαφα,γÏήγοÏος εξεÏευνητής,Î¼ÎµÎ½Î¿Ï ÎµÎ¾ÎµÏευνητή,μενοÏ,εικονίδια,tiles,εφαÏμογίδια,ÎναÏξη,τονισμός,χειÏιστήÏια, μεγÎθυνση εικονιδίων + Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aÅtokaÅo,kaÅo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo + Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados + Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase +--- menutab_impl.cpp (revision 755866) ++++ menutab_impl.cpp (revision 774645) +@@ -16,12 +16,16 @@ + */ + + #include <qcheckbox.h> ++#include <qgroupbox.h> + #include <qdir.h> + #include <qlabel.h> + #include <qlayout.h> + #include <qpushbutton.h> + #include <qradiobutton.h> ++#include <qcombobox.h> ++#include <qbuttongroup.h> + ++#include <dcopref.h> + #include <kapplication.h> + #include <kdebug.h> + #include <kdesktopfile.h> +@@ -123,12 +127,41 @@ void MenuTab::load( bool useDefaults ) + } + } + ++ c->setGroup("General"); ++ m_comboMenuStyle->setCurrentItem( c->readBoolEntry("LegacyKMenu", false) ? 1 : 0 ); ++ m_openOnHover->setChecked( c->readBoolEntry("OpenOnHover", true) ); ++ menuStyleChanged(); ++ ++ connect(m_comboMenuStyle, SIGNAL(activated(int)), SIGNAL(changed())); ++ connect(m_comboMenuStyle, SIGNAL(activated(int)), SLOT(menuStyleChanged())); ++ connect(m_openOnHover, SIGNAL(clicked()), SIGNAL(changed())); ++ + m_showFrequent->setChecked(true); + + if ( useDefaults ) + emit changed(); + } + ++void MenuTab::menuStyleChanged() ++{ ++ if (m_comboMenuStyle->currentItem()==1) { ++ m_openOnHover->setEnabled(false); ++ m_subMenus->setEnabled(true); ++ kcfg_UseSidePixmap->setEnabled(true); ++ kcfg_MenuEntryFormat->setEnabled(true); ++ kcfg_RecentVsOften->setEnabled(true); ++ m_showFrequent->setEnabled(true); ++ } ++ else { ++ m_openOnHover->setEnabled(true); ++ m_subMenus->setEnabled(false); ++ kcfg_UseSidePixmap->setEnabled(false); ++ kcfg_MenuEntryFormat->setEnabled(false); ++ kcfg_RecentVsOften->setEnabled(false); ++ m_showFrequent->setEnabled(false); ++ } ++} ++ + void MenuTab::save() + { + KSharedConfig::Ptr c = KSharedConfig::openConfig(KickerConfig::the()->configName()); +@@ -154,8 +187,17 @@ void MenuTab::save() + } + } + c->writeEntry("Extensions", ext); ++ c->setGroup("General"); + ++ bool kmenusetting = m_comboMenuStyle->currentItem()==1; ++ bool oldkmenusetting = c->readBoolEntry("LegacyKMenu", false); ++ ++ c->writeEntry("LegacyKMenu", kmenusetting); ++ c->writeEntry("OpenOnHover", m_openOnHover->isChecked()); + c->sync(); ++ ++ if (kmenusetting != oldkmenusetting) ++ DCOPRef ("kicker", "default").call("restart()"); + } + + void MenuTab::defaults() +--- menutab.ui (revision 755866) ++++ menutab.ui (revision 774645) +@@ -8,8 +8,8 @@ + <rect> + <x>0</x> + <y>0</y> +- <width>410</width> +- <height>437</height> ++ <width>923</width> ++ <height>649</height> + </rect> + </property> + <vbox> +@@ -19,6 +19,59 @@ + <property name="margin"> + <number>0</number> + </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout5</cstring> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>textLabel1</cstring> ++ </property> ++ <property name="text"> ++ <string>Start menu style:</string> ++ </property> ++ <property name="buddy" stdset="0"> ++ <cstring>comboMenuStyle</cstring> ++ </property> ++ </widget> ++ <widget class="QComboBox"> ++ <item> ++ <property name="text"> ++ <string>SUSE</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>KDE</string> ++ </property> ++ </item> ++ <property name="name"> ++ <cstring>m_comboMenuStyle</cstring> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer4</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>40</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ </hbox> ++ </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>m_kmenuGroup</cstring> +@@ -38,6 +91,14 @@ + <property name="name"> + <cstring>unnamed</cstring> + </property> ++ <widget class="QCheckBox" row="0" column="0"> ++ <property name="name"> ++ <cstring>m_openOnHover</cstring> ++ </property> ++ <property name="text"> ++ <string>Open menu on mouse hover</string> ++ </property> ++ </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>kcfg_MenuEntryFormat</cstring> +@@ -377,6 +438,8 @@ + </widget> + </vbox> + </widget> ++<customwidgets> ++</customwidgets> + <tabstops> + <tabstop>m_formatSimple</tabstop> + <tabstop>m_formatNameDesc</tabstop> +@@ -400,8 +463,5 @@ + <includehints> + <includehint>klistview.h</includehint> + <includehint>knuminput.h</includehint> +- <includehint>knuminput.h</includehint> +- <includehint>knuminput.h</includehint> +- <includehint>knuminput.h</includehint> + </includehints> + </UI> +--- kicker_config_menus.desktop (revision 755866) ++++ kicker_config_menus.desktop (revision 774645) +@@ -143,7 +143,7 @@ Keywords[csb]=kicker,panel,kpanel,lëstà + Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo + Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,hÃ¥ndterer,ikoner + Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole +-Keywords[el]=kicker,πίνακας,kpanel,γÏαμμή εÏγασιών,γÏαμμή ÎναÏξης,γÏαμμή εκκίνησης,τοποθεσία,μÎγεθος,αυτόματη απόκÏυψη,απόκÏυψη,κουμπιά,εφΠκίνησης,φόντο,θÎματα,λανθάνουσα μνήμη μενοÏ,λανθάνουσα μνήμη,κÏυφό, K-ΜενοÏ,σελιδοδείκτες,Ï€Ïόσφατα ÎγγÏαφα,γÏήγοÏος εξεÏευνητής,Î¼ÎµÎ½Î¿Ï ÎµÎ¾ÎµÏευνητή,μενοÏ,εικονίδια,tiles,μικÏοεφαÏμογÎÏ‚,ÎναÏξη,τονισμός,χειÏιστήÏια, μεγÎθυνση εικονιδίων ++Keywords[el]=kicker,πίνακας,kpanel,γÏαμμή εÏγασιών,γÏαμμή ÎναÏξης,γÏαμμή εκκίνησης,τοποθεσία,μÎγεθος,αυτόματη απόκÏυψη,απόκÏυψη,κουμπιά,εφΠκίνησης,φόντο,θÎματα,λανθάνουσα μνήμη μενοÏ,λανθάνουσα μνήμη,κÏυφό, K-ΜενοÏ,σελιδοδείκτες,Ï€Ïόσφατα ÎγγÏαφα,γÏήγοÏος εξεÏευνητής,Î¼ÎµÎ½Î¿Ï ÎµÎ¾ÎµÏευνητή,μενοÏ,εικονίδια,tiles,εφαÏμογίδια,ÎναÏξη,τονισμός,χειÏιστήÏια, μεγÎθυνση εικονιδίων + Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aÅtokaÅo,kaÅo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo + Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados + Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase diff --git a/opensuse/core/tdebase/kickoff.diff b/opensuse/core/tdebase/kickoff.diff new file mode 100644 index 000000000..e2d73f567 --- /dev/null +++ b/opensuse/core/tdebase/kickoff.diff @@ -0,0 +1,9812 @@ +--- taskbar/taskcontainer.cpp (Revision 849788) ++++ taskbar/taskcontainer.cpp (Revision 849791) +@@ -67,7 +67,11 @@ + discardNextMouseEvent(false), + aboutToActivate(false), + m_mouseOver(false), +- m_paintEventCompression(false) ++ animationTimer(0, "TaskContainer::animationTimer"), ++ dragSwitchTimer(0, "TaskContainer::dragSwitchTimer"), ++ attentionTimer(0, "TaskContainer::attentionTimer"), ++ m_paintEventCompression(false), ++ m_paintEventCompressionTimer(0, "TaskContainer::paintEventCompressionTimer") + { + init(); + setAcceptDrops(true); // Always enabled to activate task during drag&drop. +@@ -95,7 +99,11 @@ + discardNextMouseEvent(false), + aboutToActivate(false), + m_mouseOver(false), +- m_paintEventCompression(false) ++ animationTimer(0, "TaskContainer::animationTimer"), ++ dragSwitchTimer(0, "TaskContainer::dragSwitchTimer"), ++ attentionTimer(0, "TaskContainer::attentionTimer"), ++ m_paintEventCompression(false), ++ m_paintEventCompressionTimer(0, "TaskContainer::paintEventCompressionTimer") + { + init(); + setEnabled(false); +--- taskbar/taskbar.cpp 2009/11/20 21:00:26 1.1 ++++ taskbar/taskbar.cpp 2009/11/20 21:00:38 +@@ -59,7 +59,8 @@ + m_showIcon(false), + m_showOnlyIconified(false), + m_textShadowEngine(0), +- m_ignoreUpdates(false) ++ m_ignoreUpdates(false), ++ m_relayoutTimer(0, "TaskBar::m_relayoutTimer") + { + arrowType = LeftArrow; + blocklayout = true; +--- libkicker/panelbutton.h (Revision 849788) ++++ libkicker/panelbutton.h (Revision 849791) +@@ -254,9 +254,11 @@ + /** + * Sets the direction to pop up the contents of the button. + */ +- void setPopupDirection(KPanelApplet::Direction d); ++ virtual void setPopupDirection(KPanelApplet::Direction d); + + protected: ++ ++ void setIconAlignment(AlignmentFlags align); + /** + * Subclasses must implement this to define the name of the button which is + * used to identify this button for saving and loading. It must be unique +@@ -391,6 +393,7 @@ + QPixmap m_iconz; // mouse over + KPanelExtension::Position m_arrowDirection; + KPanelApplet::Direction m_popupDirection; ++ AlignmentFlags m_iconAlignment; + Orientation m_orientation; + int m_size; + double m_fontPercent; +@@ -419,12 +422,12 @@ + * Sets the button's popup menu. + * @param popup the menu to pop up + */ +- void setPopup(QPopupMenu *popup); ++ void setPopup(QWidget *popup); + + /** + * @return the button's popup menu + */ +- QPopupMenu *popup() const; ++ QWidget *popup() const; + + bool eventFilter(QObject *, QEvent *); + virtual void showMenu(); +@@ -459,8 +462,8 @@ + private slots: + void menuAboutToHide(); + +-private: +- QPopupMenu *m_popup; ++protected: ++ QWidget *m_popup; + bool m_pressedDuringPopup; + bool m_initialized; + +--- libkicker/kickerSettings.kcfg (Revision 849788) ++++ libkicker/kickerSettings.kcfg (Revision 849791) +@@ -98,6 +98,70 @@ + <label>A list of extensions that have been loaded at runtime. In the case of a crash these extensions will not be loaded at the next Kicker start, in case they caused the crash</label> + </entry> + ++<entry name="LegacyKMenu" type="Bool" > ++ <label>When this option is enabled, the classic K Menu is used.</label> ++ <default>false</default> ++ </entry> ++ ++<entry name="OpenOnHover" type="Bool" > ++ <label>When this option is enabled, the SUSE Menu does open on mouse hover.</label> ++ <default>true</default> ++ </entry> ++ ++<entry name="ScrollFlipView" type="Bool" > ++ <label>When this option is enabled, the SUSE Menu application view switching will scroll.</label> ++ <default>true</default> ++ </entry> ++ ++<entry name="KMenuWidth" type="Int"> ++ <label>Preferred width of the KMenu</label> ++ <default>0</default> ++ </entry> ++ ++<entry name="KMenuHeight" type="Int"> ++ <label>Preferred width of the KMenu</label> ++ <default>0</default> ++ </entry> ++ ++<entry name="KickoffFontPointSizeOffset" type="Int" > ++ <label>With this option the scale of the fonts Kickoff uses can be influenced</label> ++ <default>0</default> ++ <min>-100</min> ++ <max>100</max> ++ </entry> ++ ++<entry name="KickoffSearchAddressBook" type="Bool" > ++ <label>When this option is enabled, kabc is utilized to search for addresses. This may start KMail.</label> ++ <default>false</default> ++ </entry> ++ ++<entry name="KickoffDrawGeekoEye" type="Bool" > ++ <label>When this option is enabled, the Geeko eye moves when the mouse hovers the start menu button</label> ++ <default>false</default> ++ </entry> ++ ++<entry name="KickoffTabBarFormat" type="Enum" > ++ <choices> ++ <choice name="LabelAndIcon"> ++ <label>Show names and icons on tabs</label> ++ </choice> ++ <choice name="LabelOnly"> ++ <label>Show only the names</label> ++ </choice> ++ <choice name="IconOnly"> ++ <label>Show only the icons</label> ++ </choice> ++ </choices> ++ <default>LabelAndIcon</default> ++ <label>Appearace of the Kickoff tabbar</label> ++ </entry> ++ ++<entry name="KickoffSwitchTabsOnHover" type="Bool" > ++ <label>When this option is enabled, the tabs in the Kickoff menu will switch without the need to click</label> ++ <default>true</default> ++ </entry> ++ ++ + </group> + + <group name="menus"> +@@ -172,6 +236,19 @@ + <default>false</default> + </entry> + ++<entry name="Favorites" type="StringList"> ++ <label>The menu entries shown in the Favorites tab</label> ++ </entry> ++ ++<entry name="FirstRun" type="Bool" > ++ <label>Whether the panel has been started before or not</label> ++ <default>false</default> ++ </entry> ++ ++<entry name="FirstSeenApps" type="StringList"> ++ <label>When the applications were first seen by Kickoff</label> ++ </entry> ++ + </group> + + <group name="button_tiles"> +@@ -337,6 +414,29 @@ + + </group> + ++ <group name="SearchField"> ++ <entry key="History" type="PathList"> ++ <default></default> ++ <label></label> ++ <whatsthis></whatsthis> ++ </entry> ++ <entry key="HistoryLength" type="Int"> ++ <default>50</default> ++ <label></label> ++ <whatsthis></whatsthis> ++ </entry> ++ <entry key="CompletionItems" type="PathList"> ++ <default></default> ++ <label></label> ++ <whatsthis></whatsthis> ++ </entry> ++ <entry key="CompletionMode" type="Int"> ++ <default>2</default> ++ <label></label> ++ <whatsthis></whatsthis> ++ </entry> ++ </group> ++ + </kcfg> + + +--- libkicker/kickertip.cpp (Revision 849788) ++++ libkicker/kickertip.cpp (Revision 849791) +@@ -38,6 +38,7 @@ + + // putting this #include higher results in compile errors + #include <netwm.h> ++#include <assert.h> + + static const int DEFAULT_FRAMES_PER_SECOND = 30; + +@@ -71,14 +72,16 @@ + m_dissolveDelta(-1), + m_direction(KPanelApplet::Up), + m_dirty(false), +- m_toolTipsEnabled(KickerSettings::showToolTips()), +- m_tippingFor(0) ++ m_tippingFor(0), ++ m_timer(0, "KickerTip::m_timer"), ++ m_frameTimer(0, "KickerTip::m_frameTimer") + { + setFocusPolicy(NoFocus); + setBackgroundMode(NoBackground); + resize(0, 0); + hide(); + connect(&m_frameTimer, SIGNAL(timeout()), SLOT(internalUpdate())); ++ connect(kapp, SIGNAL(settingsChanged(SettingsCategory)), SLOT(slotSettingsChanged())); + } + + KickerTip::~KickerTip() +@@ -87,6 +90,11 @@ + delete m_mimeFactory; + } + ++void KickerTip::slotSettingsChanged() ++{ ++ QToolTip::setGloballyEnabled(KickerSettings::showToolTips()); ++} ++ + void KickerTip::display() + { + if (!tippingEnabled()) +@@ -192,9 +200,7 @@ + + void KickerTip::mousePressEvent(QMouseEvent * /*e*/) + { +- QToolTip::setGloballyEnabled(m_toolTipsEnabled); + m_timer.stop(); +- m_frameTimer.stop(); + hide(); + } + +@@ -395,8 +401,11 @@ + m_tippingEnabled--; + } + ++ assert(m_tippingEnabled >= -1); ++ + if (m_tippingEnabled < 1 && m_self) + { ++ m_self->m_timer.stop(); + m_self->hide(); + } + } +@@ -411,6 +420,8 @@ + m_tippingFor = 0; + m_frameTimer.stop(); + QWidget::hide(); ++ ++ QToolTip::setGloballyEnabled(KickerSettings::showToolTips()); + } + + bool KickerTip::eventFilter(QObject *object, QEvent *event) +@@ -439,7 +450,6 @@ + !qApp->activePopupWidget() && + !isTippingFor(widget)) + { +- m_toolTipsEnabled = QToolTip::isGloballyEnabled(); + QToolTip::setGloballyEnabled(false); + + tipFor(widget); +@@ -461,8 +471,6 @@ + } + break; + case QEvent::Leave: +- QToolTip::setGloballyEnabled(m_toolTipsEnabled); +- + m_timer.stop(); + + if (isTippingFor(widget) && isVisible()) +@@ -475,9 +483,7 @@ + tipFor(0); + break; + case QEvent::MouseButtonPress: +- QToolTip::setGloballyEnabled(m_toolTipsEnabled); + m_timer.stop(); +- m_frameTimer.stop(); + hide(); + default: + break; +--- libkicker/kickertip.h (Revision 849788) ++++ libkicker/kickertip.h (Revision 849791) +@@ -92,6 +92,7 @@ + void tipperDestroyed(QObject* o); + void internalUpdate(); + void display(); ++ void slotSettingsChanged(); + + private: + QBitmap m_mask; +@@ -108,7 +109,6 @@ + QTimer m_timer; + QTimer m_frameTimer; + bool m_dirty; +- bool m_toolTipsEnabled; + + const QWidget* m_tippingFor; + +--- libkicker/panelbutton.cpp (Revision 849788) ++++ libkicker/panelbutton.cpp (Revision 849791) +@@ -42,6 +42,7 @@ + #include <kipc.h> + #include <kstandarddirs.h> + #include <klocale.h> ++#include <kdebug.h> + + #include "global.h" + +@@ -65,6 +66,7 @@ + m_hasAcceptedDrag(false), + m_arrowDirection(KPanelExtension::Bottom), + m_popupDirection(KPanelApplet::Up), ++ m_iconAlignment(AlignCenter), + m_orientation(Horizontal), + m_size((KIcon::StdSizes)-1), + m_fontPercent(0.40) +@@ -186,6 +188,12 @@ + setArrowDirection(KickerLib::directionToPopupPosition(d)); + } + ++void PanelButton::setIconAlignment(AlignmentFlags align) ++{ ++ m_iconAlignment = align; ++ update(); ++} ++ + void PanelButton::setOrientation(Orientation o) + { + m_orientation = o; +@@ -300,7 +308,9 @@ + + int PanelButton::heightForWidth(int width) const + { +- return preferredDimension(width); ++ int rc=preferredDimension(width); ++ ++ return rc; + } + + const QPixmap& PanelButton::labelIcon() const +@@ -556,11 +566,16 @@ + icon.height() - 2); + } + ++ int y = 0; ++ if (m_iconAlignment & AlignVCenter) ++ y = (height() - icon.height()) / 2; ++ else if (m_iconAlignment & AlignBottom) ++ y = (height() - icon.height()); ++ + if (!m_buttonText.isEmpty() && orientation() == Horizontal) + { + int h = height(); + int w = width(); +- int y = (h - icon.height())/2; + p->save(); + QFont f = font(); + +@@ -629,8 +644,11 @@ + } + else if (!icon.isNull()) + { +- int y = (height() - icon.height()) / 2; +- int x = (width() - icon.width()) / 2; ++ int x = 0; ++ if (m_iconAlignment & AlignHCenter) ++ x = (width() - icon.width()) / 2; ++ else if (m_iconAlignment & AlignRight) ++ x = (width() - icon.width()); + p->drawPixmap(x, y, icon); + } + +@@ -792,7 +810,19 @@ + QString nm = m_iconName; + KIcon::States defaultState = isEnabled() ? KIcon::DefaultState : + KIcon::DisabledState; +- m_icon = ldr->loadIcon(nm, KIcon::Panel, m_size, defaultState, 0L, true); ++ if (nm=="kmenu-suse") ++ { ++ QString pth = locate( "data", "kicker/pics/kmenu_basic.mng" ); ++ if (!pth.isEmpty()) ++ { ++ m_icon = QImage(pth); ++ m_iconh = QPixmap(m_icon); ++ m_iconz = QPixmap(m_icon); ++ return; ++ } ++ } ++ else ++ m_icon = ldr->loadIcon(nm, KIcon::Panel, m_size, defaultState, 0L, true); + + if (m_icon.isNull()) + { +@@ -857,7 +887,7 @@ + connect(this, SIGNAL(pressed()), SLOT(slotExecMenu())); + } + +-void PanelPopupButton::setPopup(QPopupMenu *popup) ++void PanelPopupButton::setPopup(QWidget *popup) + { + if (m_popup) + { +@@ -875,7 +905,7 @@ + } + } + +-QPopupMenu *PanelPopupButton::popup() const ++QWidget *PanelPopupButton::popup() const + { + return m_popup; + } +@@ -954,7 +984,9 @@ + } + + m_popup->adjustSize(); +- m_popup->exec(KickerLib::popupPosition(popupDirection(), m_popup, this)); ++ if(dynamic_cast<QPopupMenu*>(m_popup)) ++ static_cast<QPopupMenu*>(m_popup)->exec(KickerLib::popupPosition(popupDirection(), m_popup, this)); ++ // else.. hmm. some derived class has to fix it. + } + + void PanelPopupButton::menuAboutToHide() +@@ -964,8 +996,10 @@ + return; + } + +- setDown(false); +- KickerTip::enableTipping(true); ++ if (isDown()) { ++ setDown(false); ++ KickerTip::enableTipping(true); ++ } + } + + void PanelPopupButton::triggerDrag() +@@ -983,3 +1017,5 @@ + m_initialized = initialized; + } + ++ ++ +--- extensions/kasbar/kasbar.cpp (Revision 849788) ++++ extensions/kasbar/kasbar.cpp (Revision 849791) +@@ -719,7 +719,7 @@ + i->setText( "Animated" ); + i->setIcon( KGlobal::iconLoader()->loadIcon( "icons", KIcon::NoGroup, KIcon::SizeMedium ) ); + i->setAnimation( resources()->startupAnimation() ); +- QTimer *aniTimer = new QTimer( i ); ++ QTimer *aniTimer = new QTimer( i, "aniTimer" ); + connect( aniTimer, SIGNAL( timeout() ), i, SLOT( advanceAnimation() ) ); + aniTimer->start( 100 ); + i->setShowAnimation( true ); +--- extensions/kasbar/kasclockitem.cpp (Revision 849788) ++++ extensions/kasbar/kasclockitem.cpp (Revision 849791) +@@ -38,7 +38,7 @@ + { + setCustomPopup( true ); + +- QTimer *t = new QTimer( this ); ++ QTimer *t = new QTimer( this, "t" ); + connect( t, SIGNAL( timeout() ), SLOT( updateTime() ) ); + t->start( 1000 ); + +--- extensions/kasbar/kasstartupitem.cpp (Revision 849788) ++++ extensions/kasbar/kasstartupitem.cpp (Revision 849791) +@@ -79,7 +79,7 @@ + setShowFrame( false ); + setAnimation( resources()->startupAnimation() ); + +- aniTimer = new QTimer( this ); ++ aniTimer = new QTimer( this, "aniTimer" ); + connect( aniTimer, SIGNAL( timeout() ), SLOT( aniTimerFired() ) ); + aniTimer->start( 100 ); + } +--- extensions/kasbar/kasloaditem.cpp (Revision 849788) ++++ extensions/kasbar/kasloaditem.cpp (Revision 849791) +@@ -33,7 +33,7 @@ + KasLoadItem::KasLoadItem( KasBar *parent ) + : KasItem( parent ) + { +- QTimer *t = new QTimer( this ); ++ QTimer *t = new QTimer( this, "KasLoadItem::t" ); + connect( t, SIGNAL( timeout() ), SLOT( updateDisplay() ) ); + t->start( 1000 ); + updateDisplay(); +--- kicker/interfaces/kickoff-search-plugin.h (Revision 0) ++++ kicker/interfaces/kickoff-search-plugin.h (Revision 849791) +@@ -0,0 +1,106 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * Copyright (c) 2006 Debajyoti Bera <dbera.web@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. * ++ ***************************************************************************/ ++ ++#ifndef KICKOFF_SEARCH_PLUGIN_H ++#define KICKOFF_SEARCH_PLUGIN_H ++ ++#include "kickoffsearchinterface.h" ++ ++#include <qobject.h> ++#include <kurl.h> ++#include <kservice.h> ++ ++typedef enum { ++ ACTIONS = 0, ++ APPS, ++ BOOKMARKS, ++ NOTES, ++ MAILS, ++ FILES, ++ MUSIC, ++ WEBHIST, ++ CHATS, ++ FEEDS, ++ PICS, ++ VIDEOS, ++ DOCS, ++ OTHER, ++ num_categories ++} CATEGORY; ++ ++class HitMenuItem ++{ ++public: ++ HitMenuItem (int id, int category) ++ : id (id), category (category),score(0) { } /* dummy */ ++ HitMenuItem (QString name, QString info, KURL uri, QString mimetype, int id, int category, QString icon=QString::null, int score = 0) ++ : display_name (name) ++ , display_info (info) ++ , uri (uri) ++ , mimetype (mimetype) ++ , id (id) ++ , category (category) ++ , icon (icon) ++ , score (score) ++ , service (NULL) { } ++ ++ ~HitMenuItem () { } ++ ++ bool operator< (HitMenuItem item) ++ { ++ return ((category == item.category && score > item.score) || (category == item.category && id < item.id) || ++ (category < item.category)); ++ } ++ ++ // FIXME: We dont really need to store display_name and display_info ++ QString display_name; // name to display ++ QString display_info; // other information to display ++ KURL uri; // uri to open when clicked ++ QString mimetype; ++ int id; // id of the item in the menu ++ int category; ++ QString icon; ++ int score; ++ KService::Ptr service; ++ ++ QString quotedPath () const ++ { ++ return uri.path ().replace ('"', "\\\""); ++ } ++}; ++ ++namespace KickoffSearch { ++ ++ class Plugin : public QObject ++ { ++ Q_OBJECT ++ ++ public: ++ Plugin(QObject *parent, const char* name=0); ++ virtual ~Plugin(); ++ ++ virtual bool daemonRunning()=0; ++ virtual void query(QString,bool)=0; ++ ++ KickoffSearchInterface * kickoffSearchInterface(); ++ }; ++}; ++ ++#endif /* KICKOFF_SEARCH_PLUGIN_H */ +--- kicker/interfaces/kickoffsearchinterface.cpp (Revision 0) ++++ kicker/interfaces/kickoffsearchinterface.cpp (Revision 849791) +@@ -0,0 +1,27 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * * ++ * 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 "kickoffsearchinterface.h" ++ ++KickoffSearch::KickoffSearchInterface::KickoffSearchInterface( QObject* parent, const char* name ) ++ :QObject( parent, name ) ++{ ++} ++ ++#include "kickoffsearchinterface.moc" +--- kicker/interfaces/Makefile.am (Revision 0) ++++ kicker/interfaces/Makefile.am (Revision 849791) +@@ -0,0 +1,12 @@ ++METASOURCES = AUTO ++INCLUDES= -I$(top_srcdir)/src $(all_includes) ++ ++# The library containing the plugin base class ++lib_LTLIBRARIES = libkickoffsearch_interfaces.la ++libkickoffsearch_interfaces_la_SOURCES = kickoff-search-plugin.cpp kickoffsearchinterface.cpp ++libkickoffsearch_interfaces_la_LDFLAGS = $(all_libraries) -version-info 0:0:0 ++ ++kickoffsearchincludedir = $(includedir) ++kickoffsearchinclude_HEADERS = kickoff-search-plugin.h kickoffsearchinterface.h ++ ++kde_servicetypes_DATA = kickoffsearchplugin.desktop +--- kicker/interfaces/kickoffsearchinterface.h (Revision 0) ++++ kicker/interfaces/kickoffsearchinterface.h (Revision 849791) +@@ -0,0 +1,46 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * * ++ * 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. * ++ ***************************************************************************/ ++ ++#ifndef KICKOFFSEARCHINTERFACE_H ++#define KICKOFFSEARCHINTERFACE_H ++ ++#include <qobject.h> ++ ++class HitMenuItem; ++ ++namespace KickoffSearch ++{ ++ class KickoffSearchInterface :public QObject ++ { ++ Q_OBJECT ++ ++ public: ++ KickoffSearchInterface( QObject* parent, const char* name = 0); ++ ++ public: ++ virtual bool anotherHitMenuItemAllowed(int cat) = 0; ++ virtual void addHitMenuItem(HitMenuItem* item) = 0; ++ virtual void searchOver() = 0; ++ virtual void initCategoryTitlesUpdate() = 0; ++ virtual void updateCategoryTitles() = 0; ++ }; ++} ++ ++#endif /* SELECTIONINTERFACE_H */ ++ +--- kicker/interfaces/kickoffsearchplugin.desktop (Revision 0) ++++ kicker/interfaces/kickoffsearchplugin.desktop (Revision 849791) +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Type=ServiceType ++X-KDE-ServiceType=KickoffSearch/Plugin ++Comment=A search plugin for Kickoff +--- kicker/interfaces/kickoff-search-plugin.cpp (Revision 0) ++++ kicker/interfaces/kickoff-search-plugin.cpp (Revision 849791) +@@ -0,0 +1,37 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * * ++ * 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 "kickoff-search-plugin.h" ++#include <qobjectlist.h> ++ ++KickoffSearch::Plugin::Plugin(QObject *parent, const char* name ) ++ :QObject( parent, name ) ++{ ++} ++ ++KickoffSearch::Plugin::~Plugin() ++{ ++} ++ ++KickoffSearch::KickoffSearchInterface* KickoffSearch::Plugin::kickoffSearchInterface() ++{ ++ return static_cast<KickoffSearchInterface*>( parent()->child( 0, "KickoffSearch::KickoffSearchInterface" ) ); ++} ++ ++#include "kickoff-search-plugin.moc" + +Eigenschaftsänderungen: kicker/interfaces +___________________________________________________________________ +Hinzugefügt: svn:ignore + + .deps +libkickoffsearch_interfaces.la +.libs +Makefile +Makefile.in +*.moc + + +--- kicker/core/menumanager.h (Revision 849788) ++++ kicker/core/menumanager.h (Revision 849791) +@@ -28,7 +28,9 @@ + #include <qvaluelist.h> + + class PanelKMenu; ++class KMenu; + class KickerClientMenu; ++class KMenuStub; + class PanelPopupButton; + + typedef QValueList<PanelPopupButton*> KButtonList; +@@ -50,13 +52,12 @@ + bool process(const QCString &fun, const QByteArray &data, QCString& replyType, QByteArray &reply); + + // KMenu controls +- PanelKMenu* kmenu() { return m_kmenu; } +- void showKMenu(); ++ KMenuStub* kmenu() { return m_kmenu; } + void popupKMenu(const QPoint &p); + + void registerKButton(PanelPopupButton *button); + void unregisterKButton(PanelPopupButton *button); +- PanelPopupButton* findKButtonFor(QPopupMenu* menu); ++ PanelPopupButton* findKButtonFor(QWidget* menu); + ~MenuManager(); + + public slots: +@@ -67,7 +68,7 @@ + void applicationRemoved(const QCString&); + + protected: +- PanelKMenu* m_kmenu; ++ KMenuStub* m_kmenu; + typedef QValueList<KickerClientMenu*> ClientMenuList; + ClientMenuList clientmenus; + +--- kicker/core/kicker.cpp (Revision 849788) ++++ kicker/core/kicker.cpp (Revision 849791) +@@ -48,6 +48,8 @@ + #include "extensionmanager.h" + #include "pluginmanager.h" + #include "menumanager.h" ++#include "k_new_mnu.h" ++#include "k_mnu_stub.h" + #include "k_mnu.h" + #include "showdesktop.h" + #include "panelbutton.h" +@@ -106,6 +108,7 @@ + + KGlobal::iconLoader()->addExtraDesktopThemes(); + ++ KGlobal::locale()->insertCatalogue("kdmgreet"); + KGlobal::locale()->insertCatalogue("libkonq"); + KGlobal::locale()->insertCatalogue("libdmctl"); + KGlobal::locale()->insertCatalogue("libtaskbar"); +@@ -212,7 +215,7 @@ + + void Kicker::showKMenu() + { +- MenuManager::the()->showKMenu(); ++ MenuManager::the()->kmenuAccelActivated(); + } + + void Kicker::popupKMenu(const QPoint &p) +--- kicker/core/container_button.cpp (Revision 849788) ++++ kicker/core/container_button.cpp (Revision 849791) +@@ -43,6 +43,7 @@ + #include "desktopbutton.h" + #include "extensionbutton.h" + #include "kbutton.h" ++#include "knewbutton.h" + #include "kicker.h" + #include "kickerSettings.h" + #include "kickertip.h" +@@ -326,14 +327,20 @@ + : ButtonContainer(opMenu, parent) + { + checkImmutability(config); +- embedButton( new KButton(this) ); ++ if(KickerSettings::legacyKMenu()) ++ embedButton( new KButton(this) ); ++ else ++ embedButton( new KNewButton(this) ); + _actions = PanelAppletOpMenu::KMenuEditor; + } + + KMenuButtonContainer::KMenuButtonContainer(QPopupMenu *opMenu, QWidget* parent) + : ButtonContainer(opMenu, parent) + { +- embedButton( new KButton(this) ); ++ if(KickerSettings::legacyKMenu()) ++ embedButton( new KButton(this) ); ++ else ++ embedButton( new KNewButton(this) ); + _actions = PanelAppletOpMenu::KMenuEditor; + } + +--- kicker/core/main.cpp (Revision 849788) ++++ kicker/core/main.cpp (Revision 849791) +@@ -108,7 +108,7 @@ + appname.sprintf("kicker-screen-%d", kicker_screen_number); + + KAboutData aboutData( appname.data(), I18N_NOOP("KDE Panel"), +- version, description, KAboutData::License_BSD, ++ version, description, KAboutData::License_GPL_V2, + I18N_NOOP("(c) 1999-2004, The KDE Team") ); + + aboutData.addAuthor("Aaron J. Seigo", I18N_NOOP("Current maintainer"), "aseigo@kde.org"); +--- kicker/core/menumanager.cpp (Revision 849788) ++++ kicker/core/menumanager.cpp (Revision 849791) +@@ -31,9 +31,12 @@ + #include "client_mnu.h" + #include "container_extension.h" + #include "global.h" ++#include "k_new_mnu.h" + #include "k_mnu.h" ++#include "k_mnu_stub.h" + #include "kicker.h" + #include "panelbutton.h" ++#include "kickerSettings.h" + + #include "menumanager.h" + #include "menumanager.moc" +@@ -62,7 +65,11 @@ + MenuManager::MenuManager(QObject *parent) + : QObject(parent, "MenuManager"), DCOPObject("MenuManager") + { +- m_kmenu = new PanelKMenu; ++ if (KickerSettings::legacyKMenu()) ++ m_kmenu = new KMenuStub(new PanelKMenu); ++ else ++ m_kmenu = new KMenuStub(new KMenu); ++ + kapp->dcopClient()->setNotifications(true); + connect(kapp->dcopClient(), SIGNAL(applicationRemoved(const QCString&)), + this, SLOT(applicationRemoved(const QCString&))); +@@ -83,14 +90,8 @@ + m_kmenu->selectFirstItem(); + } + +-void MenuManager::showKMenu() +-{ +- m_kmenu->showMenu(); +-} +- + void MenuManager::popupKMenu(const QPoint &p) + { +-// kdDebug(1210) << "popupKMenu()" << endl; + if (m_kmenu->isVisible()) + { + m_kmenu->hide(); +@@ -120,7 +121,7 @@ + m_kbuttons.remove(button); + } + +-PanelPopupButton* MenuManager::findKButtonFor(QPopupMenu* menu) ++PanelPopupButton* MenuManager::findKButtonFor(QWidget* menu) + { + KButtonList::const_iterator itEnd = m_kbuttons.constEnd(); + for (KButtonList::const_iterator it = m_kbuttons.constBegin(); it != itEnd; ++it) +@@ -169,7 +170,7 @@ + const QSize size = m_kmenu->sizeHint(); + m_kmenu->resize(size.width(),size.height()); + +- PanelPopupButton* button = findKButtonFor(m_kmenu); ++ PanelPopupButton* button = findKButtonFor(m_kmenu->widget()); + + // let's unhide the panel while we're at it. traverse the widget + // hierarchy until we find the panel, if any +@@ -189,7 +190,6 @@ + + menuParent = menuParent->parent(); + } +- + button->showMenu(); + } + } +@@ -213,7 +213,7 @@ + + void MenuManager::removeMenu(QCString menu) + { +- bool iterate = true; ++ bool iterate = true, need_adjustSize = false; + ClientMenuList::iterator it = clientmenus.begin(); + for (; it != clientmenus.end(); iterate ? ++it : it) + { +@@ -224,15 +224,17 @@ + m_kmenu->removeClientMenu(m->idInParentMenu); + it = clientmenus.erase(it); + iterate = false; ++ need_adjustSize = true; + } + } +- m_kmenu->adjustSize(); ++ if (need_adjustSize) ++ m_kmenu->adjustSize(); + } + + + void MenuManager::applicationRemoved(const QCString& appRemoved) + { +- bool iterate = true; ++ bool iterate = true, need_adjustSize = false; + ClientMenuList::iterator it = clientmenus.begin(); + for (; it != clientmenus.end(); iterate ? ++it : it) + { +@@ -243,9 +245,11 @@ + m_kmenu->removeClientMenu(m->idInParentMenu); + it = clientmenus.erase(it); + iterate = false; ++ need_adjustSize = true; + } + } +- m_kmenu->adjustSize(); ++ if (need_adjustSize) ++ m_kmenu->adjustSize(); + } + + bool MenuManager::process(const QCString &fun, const QByteArray &data, +--- kicker/core/unhidetrigger.cpp (Revision 849788) ++++ kicker/core/unhidetrigger.cpp (Revision 849791) +@@ -39,7 +39,7 @@ + , _lastXineramaScreen( -1 ) + , enabledCount( 0 ) + { +- _timer = new QTimer( this ); ++ _timer = new QTimer( this, "UnhideTrigger" ); + connect( _timer, SIGNAL(timeout()), SLOT(pollMouse()) ); + } + +--- kicker/core/applethandle.cpp (Revision 849788) ++++ kicker/core/applethandle.cpp (Revision 849791) +@@ -150,7 +150,7 @@ + { + if (!m_handleHoverTimer) + { +- m_handleHoverTimer = new QTimer(this); ++ m_handleHoverTimer = new QTimer(this, "m_handleHoverTimer"); + connect(m_handleHoverTimer, SIGNAL(timeout()), + this, SLOT(checkHandleHover())); + m_applet->installEventFilter(this); +@@ -177,11 +177,7 @@ + m_drawHandle = true; + resetLayout(); + +- if (m_handleHoverTimer) +- { +- m_handleHoverTimer->start(250); +- } +- break; ++ break; + } + + case QEvent::Leave: +@@ -191,6 +187,11 @@ + break; + } + ++ if (m_handleHoverTimer) ++ { ++ m_handleHoverTimer->start(250); ++ } ++ + QWidget* w = dynamic_cast<QWidget*>(o); + + bool nowDrawIt = false; +@@ -207,11 +208,6 @@ + + if (nowDrawIt != m_drawHandle) + { +- if (m_handleHoverTimer) +- { +- m_handleHoverTimer->stop(); +- } +- + m_drawHandle = nowDrawIt; + resetLayout(); + } +@@ -297,6 +293,11 @@ + } + + m_menuButton->setDown(false); ++ ++ if (m_handleHoverTimer) ++ { ++ m_handleHoverTimer->start(250); ++ } + } + + AppletHandleDrag::AppletHandleDrag(AppletHandle* parent) +--- kicker/core/containerarea.cpp 2009/11/20 21:00:18 1.1 ++++ kicker/core/containerarea.cpp 2009/11/20 21:00:38 +@@ -87,7 +87,8 @@ + m_immutable(_c->isImmutable()), + m_updateBackgroundsCalled(false), + m_layout(0), +- m_addAppletDialog(0) ++ m_addAppletDialog(0), ++ _autoScrollTimer(0, "ContainerArea::autoScrollTimer") + { + setBackgroundOrigin( WidgetOrigin ); + +--- kicker/core/Makefile.am (Revision 849788) ++++ kicker/core/Makefile.am (Revision 849791) +@@ -1,6 +1,6 @@ + INCLUDES = -I$(srcdir)/../../libkicker -I../../libkicker \ +- -I$(srcdir)/../ui -I$(srcdir)/../buttons -I$(top_srcdir)/libkonq \ +- $(all_includes) ++ -I../ui -I$(srcdir)/../ui -I$(srcdir)/../buttons -I$(top_srcdir)/libkonq \ ++ $(all_includes) + + noinst_LTLIBRARIES = libkicker_core.la + +--- kicker/Makefile.am (Revision 849788) ++++ kicker/Makefile.am (Revision 849791) +@@ -1,6 +1,6 @@ + INCLUDES = $(all_includes) + +-SUBDIRS = core ui buttons . ++SUBDIRS = core ui buttons interfaces . + + bin_PROGRAMS = + lib_LTLIBRARIES = +@@ -9,7 +9,7 @@ + CLEANFILES = dummy.cpp + + kicker_la_LIBADD = core/libkicker_core.la buttons/libkicker_buttons.la \ +- ui/libkicker_ui.la ../libkicker/libkickermain.la $(LIB_KIO) $(LIB_KUTILS) ++ ui/libkicker_ui.la ../libkicker/libkickermain.la $(LIB_KIO) $(LIB_KUTILS) $(LIB_KABC) + + kicker_la_SOURCES = dummy.cpp + kicker_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +--- kicker/ui/browser_mnu.cpp (Revision 849788) ++++ kicker/ui/browser_mnu.cpp (Revision 849791) +@@ -329,7 +329,7 @@ + if(_mimemap.count() > 0) { + + if(!_mimecheckTimer) +- _mimecheckTimer = new QTimer(this); ++ _mimecheckTimer = new QTimer(this, "_mimecheckTimer"); + + connect(_mimecheckTimer, SIGNAL(timeout()), SLOT(slotMimeCheck())); + _mimecheckTimer->start(0); +--- kicker/ui/flipscrollview.cpp (Revision 0) ++++ kicker/ui/flipscrollview.cpp (Revision 849791) +@@ -0,0 +1,324 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Will Stephenson <wstephenson@novell.com> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#include <qapplication.h> ++#include <qhbox.h> ++#include <qheader.h> ++#include <assert.h> ++ ++#include "itemview.h" ++#include "flipscrollview.h" ++#include "kickerSettings.h" ++ ++/* Flip scroll steps, as percentage of itemview width to scroll per ++ * step. Assumes the itemview is scrolled in ten steps */ ++ ++/* slow start, then fast */ ++//static const double scrollSteps[] = { 0.05, 0.05, 0.1125, 0.1125, 0.1125, 0.1125, 0.1125, 0.1125, 0.1125, 0.1125 }; ++ ++/* slow fast slow */ ++//static const double scrollSteps[] = { 0.05, 0.05, 0.13, 0.13, 0.15, 0.13, 0.13, 0.13, 0.05, 0.05 }; ++ ++/* slow veryfast slow */ ++static const double scrollSteps[] = { 0.03, 0.03, 0.147, 0.147, 0.147, 0.147, 0.147, 0.147, 0.03, 0.028 }; ++; ++ ++BackFrame::BackFrame( QWidget *parent ) ++ : QFrame( parent ), mouse_inside( false ) ++{ ++ setFrameStyle( QFrame::NoFrame ); ++ if ( QApplication::reverseLayout() ) ++ left_triangle.load( locate( "data", "kicker/pics/right_triangle.png" ) ); ++ else ++ left_triangle.load( locate( "data", "kicker/pics/left_triangle.png" ) ); ++} ++ ++void BackFrame::drawContents( QPainter *p ) ++{ ++ QColor gray( 230, 230, 230 ); ++ if ( mouse_inside ) ++ p->fillRect( 3, 3, width() - 6, height() - 6, colorGroup().color( QColorGroup::Highlight ) ); ++ else ++ p->fillRect( 3, 3, width() - 6, height() - 6, gray ); ++ p->setPen( gray.dark(110) ); ++ p->drawRect( 3, 3, width() - 6, height() - 6 ); ++ ++ int pixsize = ( width() - 6 ) * 3 / 5; ++ QImage i = left_triangle.convertToImage().smoothScale( pixsize, pixsize ); ++ QPixmap tri; ++ tri.convertFromImage( i ); ++ ++ p->drawPixmap( ( width() - tri.width() ) / 2, ( height() - tri.height() ) / 2, tri ); ++} ++ ++void BackFrame::enterEvent( QEvent *e ) ++{ ++ mouse_inside = true; ++ update(); ++} ++ ++void BackFrame::leaveEvent( QEvent *e ) ++{ ++ mouse_inside = false; ++ update(); ++} ++ ++void BackFrame::mousePressEvent ( QMouseEvent * e ) ++{ ++ emit clicked(); ++} ++ ++FlipScrollView::FlipScrollView( QWidget * parent, const char * name ) ++ : QScrollView( parent, name ), mState( StoppedLeft ), mScrollDirection( 1 ), mShowBack( false ) ++{ ++ setVScrollBarMode( QScrollView::AlwaysOff ); ++ setHScrollBarMode( QScrollView::AlwaysOff ); ++ setFrameStyle( QFrame::NoFrame ); ++ mLeftView = new ItemView( this, "left_view" ); ++ addChild( mLeftView ); ++ ++ mRightView = new ItemView( this, "right_view" ); ++ addChild( mRightView ); ++ ++ mTimer = new QTimer( this, "mTimer" ); ++ connect( mTimer, SIGNAL( timeout() ), SLOT( slotScrollTimer() ) ); ++ ++ connect( mLeftView, SIGNAL( startService(KService::Ptr) ), ++ SIGNAL( startService(KService::Ptr) ) ); ++ connect( mLeftView, SIGNAL( startURL(const QString& ) ), ++ SIGNAL( startURL(const QString& ) ) ); ++ connect( mLeftView, SIGNAL( rightButtonPressed(QListViewItem*,const QPoint&,int) ), ++ SIGNAL( rightButtonPressed(QListViewItem*,const QPoint&,int) ) ); ++ connect( mRightView, SIGNAL( startService(KService::Ptr) ), ++ SIGNAL( startService(KService::Ptr) ) ); ++ connect( mRightView, SIGNAL( startURL(const QString& ) ), ++ SIGNAL( startURL(const QString& ) ) ); ++ connect( mRightView, SIGNAL( rightButtonPressed(QListViewItem*,const QPoint&,int) ), ++ SIGNAL( rightButtonPressed(QListViewItem*,const QPoint&,int) ) ); ++ ++ // wild hack to make sure it has correct width ++ mLeftView->setVScrollBarMode( QScrollView::AlwaysOn ); ++ mRightView->setVScrollBarMode( QScrollView::AlwaysOn ); ++ mLeftView->setVScrollBarMode( QScrollView::Auto ); ++ mRightView->setVScrollBarMode( QScrollView::Auto ); ++ ++ mBackrow = new BackFrame( this ); ++ mBackrow->resize( 24, 100 ); ++ connect( mBackrow, SIGNAL( clicked() ), SIGNAL( backButtonClicked() ) ); ++} ++ ++ItemView* FlipScrollView::prepareRightMove() ++{ ++ if ( mState != StoppedLeft ) ++ { ++ mTimer->stop(); ++ ItemView *swap = mLeftView; ++ mLeftView = mRightView; ++ mRightView = swap; ++ moveChild( mLeftView, 0, 0 ); ++ moveChild( mRightView, width(), 0 ); ++ mBackrow->hide(); ++ mRightView->resize( width(), height() ); ++ mLeftView->resize( width(), height() ); ++ setContentsPos( 0, 0 ); ++ } ++ ++ mState = StoppedLeft; ++ mRightView->clear(); ++ return mRightView; ++} ++ ++void FlipScrollView::showBackButton( bool enable ) ++{ ++ kdDebug() << "FlipScrollView::showBackButton " << enable << endl; ++ mShowBack = enable; ++} ++ ++ItemView* FlipScrollView::prepareLeftMove(bool clear) ++{ ++ if ( mState != StoppedRight ) ++ { ++ mTimer->stop(); ++ ItemView *swap = mLeftView; ++ mLeftView = mRightView; ++ mRightView = swap; ++ moveChild( mLeftView, 0, 0 ); ++ moveChild( mRightView, width(), 0 ); ++ mRightView->resize( width(), height() ); ++ mLeftView->resize( width(), height() ); ++ mBackrow->hide(); ++ setContentsPos( width(), 0 ); ++ } ++ ++ mState = StoppedRight; ++ if (clear) ++ mLeftView->clear(); ++ return mLeftView; ++} ++ ++void FlipScrollView::viewportResizeEvent ( QResizeEvent * ) ++{ ++ mLeftView->resize( size() ); ++ mRightView->resize( width() - mBackrow->width(), height() ); ++ mBackrow->resize( mBackrow->width(), height() ); ++ resizeContents( width() * 2, height() ); ++ moveChild( mBackrow, width(), 0 ); ++ moveChild( mRightView, width() + mBackrow->width(), 0 ); ++ setContentsPos( 0, 0 ); ++} ++ ++ItemView *FlipScrollView::currentView() const ++{ ++ if ( mState == StoppedRight ) ++ return mRightView; ++ else ++ return mLeftView; ++} ++ ++ItemView *FlipScrollView::leftView() const ++{ ++ return mLeftView; ++} ++ ++ItemView *FlipScrollView::rightView() const ++{ ++ return mRightView; ++} ++ ++FlipScrollView::~FlipScrollView() {} ++ ++static const int max_steps = 10; ++ ++void FlipScrollView::slotScrollTimer() ++{ ++ mStepsRemaining--; ++ assert( mStepsRemaining >= 0 && mStepsRemaining < int(sizeof( scrollSteps ) / sizeof( double )) ); ++ if (KickerSettings::scrollFlipView()) ++ scrollBy( ( int )( mScrollDirection * mLeftView->width() * scrollSteps[ mStepsRemaining ] ), 0 ); ++ else ++ scrollBy( ( int )( mScrollDirection * mLeftView->width()), 0 ); ++ ++ if ( mStepsRemaining == 0 ) ++ { ++ if ( mState == ScrollingRight ) ++ { ++ mState = StoppedRight; ++ setContentsPos( width(), 0 ); ++ } else { ++ mState = StoppedLeft; ++ setContentsPos( 0, 0 ); ++ } ++ ++ kdDebug() << "slotScrollTimer " << mShowBack << endl; ++ ++ if ( mShowBack ) ++ { ++ mBackrow->show(); ++ if ( mState == StoppedRight ) ++ { ++ ++ if ( QApplication::reverseLayout() ) ++ moveChild( mRightView, width(), 0 ); ++ else ++ moveChild( mRightView, width() + mBackrow->width(), 0 ); ++ mRightView->resize( width() - mBackrow->width(), height() ); ++ mLeftView->resize( width(), height() ); ++ if ( QApplication::reverseLayout() ) ++ moveChild( mBackrow, width() + mRightView->width(), 0 ); ++ else ++ moveChild( mBackrow, width(), 0 ); ++ moveChild( mLeftView, 0, 0 ); ++ } else ++ { ++ moveChild( mRightView, width(), 0 ); ++ mRightView->resize( width(), height() ); ++ mLeftView->resize( width() - mBackrow->width(), height() ); ++ if ( QApplication::reverseLayout() ) ++ { ++ moveChild( mBackrow, mLeftView->width(), 0 ); ++ moveChild( mLeftView, 0, 0 ); ++ } ++ else ++ { ++ moveChild( mBackrow, 0, 0 ); ++ moveChild( mLeftView, mBackrow->width(), 0 ); ++ } ++ } ++ } else ++ mBackrow->hide(); ++ ++ if (!mSelectMenuPath.isEmpty()) { ++ if (mSelectMenuPath=="kicker:/goup/") { ++ currentView()->setSelected(currentView()->firstChild(),true); ++ currentView()->firstChild()->repaint(); ++ } ++ else { ++ QListViewItem * child = currentView()->firstChild(); ++ while( child ) { ++ KMenuItem* kitem = dynamic_cast<KMenuItem*>(child); ++ if (kitem && kitem->menuPath()==mSelectMenuPath) { ++ currentView()->setSelected(child,true); ++ kdDebug() << "child repaint\n"; ++ child->repaint(); ++ break; ++ } ++ child = child->nextSibling(); ++ } ++ } ++ } ++ mLeftView->setVScrollBarMode( QScrollView::Auto ); ++ mRightView->setVScrollBarMode( QScrollView::Auto ); ++ mTimer->stop(); ++ mLeftView->setMouseMoveSelects( true ); ++ mRightView->setMouseMoveSelects( true ); ++ } ++} ++ ++void FlipScrollView::flipScroll(const QString& selectMenuPath) ++{ ++ if ( mState == StoppedLeft ) ++ { ++ mState = ScrollingRight; ++ mScrollDirection = 1; ++ } ++ else ++ { ++ mState = ScrollingLeft; ++ mScrollDirection = -1; ++ } ++ ++ mLeftView->setVScrollBarMode( QScrollView::AlwaysOff ); ++ mRightView->setVScrollBarMode( QScrollView::AlwaysOff ); ++ if (KickerSettings::scrollFlipView()) ++ mStepsRemaining = max_steps; ++ else ++ mStepsRemaining = 1; ++ mTimer->start( 30 ); ++ mSelectMenuPath = selectMenuPath; ++ if (!mSelectMenuPath.isEmpty()) { ++ mLeftView->setMouseMoveSelects( false ); ++ mRightView->setMouseMoveSelects( false ); ++ } ++} ++ ++#include "flipscrollview.moc" +--- kicker/ui/query.cpp (Revision 0) ++++ kicker/ui/query.cpp (Revision 849791) +@@ -0,0 +1,136 @@ ++/***************************************************************** ++ ++ Copyright (c) 2006 Stephan Binner <binner@kde.org> ++ ++ 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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#include "query.h" ++#include <kdebug.h> ++ ++Query::Query() ++{ ++ alternatives.setAutoDelete(true); ++} ++ ++void Query::clear() ++{ ++ query_term = QString::null; ++ alternatives.clear(); ++} ++ ++void Query::set(const QString &term) ++{ ++ query_term = term; ++ alternatives.clear(); ++ ++ current_alternative = new Alternative; ++ current_part = QString::null; ++ within_quotes = false; ++ exclude_part = false; ++ ++ for (uint index=0;index<term.length();index++) { ++ if (current_part.isEmpty() && query_term[index]=='-') ++ exclude_part = true; ++ else if (term[index]=='\'' || term[index]=='"') { ++ if (within_quotes) ++ add_term(); ++ else ++ within_quotes = true; ++ } ++ else if (!within_quotes && query_term[index]==' ') ++ add_term(); ++ else if (!exclude_part && !within_quotes && query_term[index]=='O' && index+1<term.length() && query_term[index+1]=='R') { ++ index++; ++ alternatives.append(current_alternative); ++ current_alternative = new Alternative; ++ within_quotes = false; ++ exclude_part = false; ++ current_part = QString::null; ++ } ++ else ++ current_part+=term[index]; ++ } ++ add_term(); ++ alternatives.append(current_alternative); ++ ++#if 0 ++ for (Alternative* alt=alternatives.first(); alt; alt=alternatives.next()) { ++ kdDebug() << "---" << endl; ++ kdDebug() << "*** includes = " << alt->includes << endl; ++ kdDebug() << "*** excludes = " << alt->excludes << endl; ++ } ++#endif ++} ++ ++void Query::add_term() { ++ if (!current_part.isEmpty()) { ++ if (current_part.startsWith("*")) ++ current_part=current_part.mid(1); ++ ++ if (current_part.endsWith("*")) ++ current_part=current_part.mid(0,current_part.length()-1); ++ ++ if (exclude_part) ++ current_alternative->excludes+=current_part.lower(); ++ else ++ current_alternative->includes+=current_part.lower(); ++ } ++ within_quotes = false; ++ exclude_part = false; ++ current_part = QString::null; ++} ++ ++QString Query::get() const ++{ ++ return query_term; ++} ++ ++bool Query::matches(const QString &term) ++{ ++ QString lower_term = term.lower(); ++ ++ for (Alternative* alt=alternatives.first(); alt; alt=alternatives.next()) { ++ if (!alt->includes.count()) ++ continue; ++ ++ bool next_alternative = false; ++ ++ for ( QStringList::ConstIterator it = alt->excludes.begin(); it != alt->excludes.end(); ++it ) { ++ if ( lower_term.find(*it)!=-1 ) { ++ next_alternative = true; ++ continue; ++ } ++ } ++ if (next_alternative) ++ continue; ++ ++ for ( QStringList::ConstIterator it = alt->includes.begin(); it != alt->includes.end(); ++it ) { ++ if ( lower_term.find(*it)==-1 ) { ++ next_alternative = true; ++ continue; ++ } ++ } ++ if (next_alternative) ++ continue; ++ ++//kdDebug() << "Found hit in '" << term << "'" << endl; ++ return true; ++ } ++ ++ return false; ++} +--- kicker/ui/k_new_mnu.cpp (Revision 0) ++++ kicker/ui/k_new_mnu.cpp (Revision 849791) +@@ -0,0 +1,3779 @@ ++/***************************************************************** ++ ++ Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ Copyright (c) 2006 Debajyoti Bera <dbera.web@gmail.com> ++ Copyright (c) 2006 Dirk Mueller <mueller@kde.org> ++ ++ 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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#include <stdlib.h> ++#include <sys/types.h> ++#include <unistd.h> ++#include <dmctl.h> ++#include <inttypes.h> ++ ++#include <qimage.h> ++#include <qpainter.h> ++#include <qstyle.h> ++#include <qwidgetstack.h> ++#include <qlayout.h> ++#include <qlabel.h> ++#include <qregexp.h> ++#include <qfile.h> ++#include <qstylesheet.h> ++#include <qaccel.h> ++#include <qcursor.h> ++#include <qdir.h> ++#include <qsimplerichtext.h> ++#include <qtooltip.h> ++#include <qtabbar.h> ++ ++#include <dcopclient.h> ++#include <kapplication.h> ++#include <kaboutkde.h> ++#include <kaction.h> ++#include <kbookmarkmenu.h> ++#include <kconfig.h> ++#include <kdebug.h> ++#include <kglobal.h> ++#include <kglobalsettings.h> ++#include <kiconloader.h> ++#include <klineedit.h> ++#include <klocale.h> ++#include <kmessagebox.h> ++#include <kstandarddirs.h> ++#include <kcombobox.h> ++#include <kwin.h> ++#include <kdebug.h> ++#include <kuser.h> ++#include <kurllabel.h> ++#include <krun.h> ++#include <kmimetype.h> ++#include <krecentdocument.h> ++#include <kcompletionbox.h> ++#include <kurifilter.h> ++#include <kbookmarkmanager.h> ++#include <kbookmark.h> ++#include <kprocess.h> ++#include <kio/jobclasses.h> ++#include <kio/job.h> ++#include <dcopref.h> ++#include <konq_popupmenu.h> ++#include <konqbookmarkmanager.h> ++#include <kparts/componentfactory.h> ++ ++#include "client_mnu.h" ++#include "container_base.h" ++#include "global.h" ++#include "knewbutton.h" ++#include "kicker.h" ++#include "kickerSettings.h" ++#include "konqbookmarkmanager.h" ++#include "menuinfo.h" ++#include "menumanager.h" ++#include "popupmenutitle.h" ++#include "quickbrowser_mnu.h" ++#include "recentapps.h" ++#include "flipscrollview.h" ++#include "itemview.h" ++#include <dmctl.h> ++#include <sys/vfs.h> ++#include <mykickoffsearchinterface.h> ++ ++#include "media_watcher.h" ++#include "k_mnu.h" ++#include "k_new_mnu.h" ++#include "k_new_mnu.moc" ++#include "kickoff_bar.h" ++ ++#define WAIT_BEFORE_QUERYING 700 ++ ++#define IDS_PER_CATEGORY 20 ++#define ACTIONS_ID_BASE 10 ++#define APP_ID_BASE 10 + IDS_PER_CATEGORY ++#define BOOKMARKS_ID_BASE 10 + (IDS_PER_CATEGORY * 2) ++#define NOTES_ID_BASE 10 + (IDS_PER_CATEGORY * 3) ++#define MAIL_ID_BASE 10 + (IDS_PER_CATEGORY * 4) ++#define FILE_ID_BASE 10 + (IDS_PER_CATEGORY * 5) ++#define MUSIC_ID_BASE 10 + (IDS_PER_CATEGORY * 6) ++#define WEBHIST_ID_BASE 10 + (IDS_PER_CATEGORY * 7) ++#define CHAT_ID_BASE 10 + (IDS_PER_CATEGORY * 8) ++#define FEED_ID_BASE 10 + (IDS_PER_CATEGORY * 9) ++#define PIC_ID_BASE 10 + (IDS_PER_CATEGORY * 10) ++#define VIDEO_ID_BASE 10 + (IDS_PER_CATEGORY * 11) ++#define DOC_ID_BASE 10 + (IDS_PER_CATEGORY * 12) ++#define OTHER_ID_BASE 10 + (IDS_PER_CATEGORY * 13) ++ ++static QString calculate(const QString &exp) ++{ ++ QString result, cmd; ++ const QString bc = KStandardDirs::findExe("bc"); ++ if ( !bc.isEmpty() ) ++ cmd = QString("echo %1 | %2").arg(KProcess::quote(exp), KProcess::quote(bc)); ++ else ++ cmd = QString("echo $((%1))").arg(exp); ++ FILE *fs = popen(QFile::encodeName(cmd).data(), "r"); ++ if (fs) ++ { ++ QTextStream ts(fs, IO_ReadOnly); ++ result = ts.read().stripWhiteSpace(); ++ pclose(fs); ++ } ++ return result; ++} ++ ++static QString workaroundStringFreeze(const QString& str) ++{ ++ QString s = str; ++ ++ s.replace("<u>","&"); ++ QRegExp re("<[^>]+>"); ++ re.setMinimal(true); ++ re.setCaseSensitive(false); ++ ++ s.replace(re, ""); ++ s = s.simplifyWhiteSpace(); ++ ++ return s; ++} ++ ++int base_category_id[] = {ACTIONS_ID_BASE, APP_ID_BASE, BOOKMARKS_ID_BASE, NOTES_ID_BASE, MAIL_ID_BASE, ++ FILE_ID_BASE, MUSIC_ID_BASE, WEBHIST_ID_BASE, CHAT_ID_BASE, FEED_ID_BASE, ++ PIC_ID_BASE, VIDEO_ID_BASE, DOC_ID_BASE, OTHER_ID_BASE}; ++ ++#include <assert.h> ++ ++static int used_size( QLabel *label, int oldsize ) ++{ ++ QSimpleRichText st( label->text(), KGlobalSettings::toolBarFont() ); ++ st.setWidth( oldsize ); ++ return QMAX( st.widthUsed(), oldsize ); ++} ++ ++KMenu::KMenu() ++ : KMenuBase(0, "SUSE::Kickoff::KMenu") ++ , m_sloppyTimer(0, "KNewMenu::sloppyTimer"), m_mediaFreeTimer(0, "KNewMenu::mediaFreeTimer"), ++ m_iconName(QString::null), m_orientation(UnDetermined), m_search_plugin( 0 ) ++{ ++ setMouseTracking(true); ++ connect(&m_sloppyTimer, SIGNAL(timeout()), SLOT(slotSloppyTimeout())); ++ ++ // set the first client id to some arbitrarily large value. ++ client_id = 10000; ++ // Don't automatically clear the main menu. ++ actionCollection = new KActionCollection(this); ++ ++ connect(Kicker::the(), SIGNAL(configurationChanged()), ++ this, SLOT(configChanged())); ++ ++ KUser * user = new KUser(); ++ ++ char hostname[256]; ++ hostname[0] = '\0'; ++ if (!gethostname( hostname, sizeof(hostname) )) ++ hostname[sizeof(hostname)-1] = '\0'; ++ ++ m_userInfo->setText( i18n( "User <b>%1</b> on <b>%2</b>" ) ++ .arg( user->loginName() ).arg( hostname ) ); ++ setupUi(); ++ ++ m_userInfo->setBackgroundMode( PaletteBase ); ++ QColor userInfoColor = QApplication::palette().color( QPalette::Normal, QColorGroup::Mid ); ++ if ( qGray( userInfoColor.rgb() ) > 120 ) ++ userInfoColor = userInfoColor.dark( 200 ); ++ else ++ userInfoColor = userInfoColor.light( 200 ); ++ m_userInfo->setPaletteForegroundColor( userInfoColor ); ++ ++ m_tabBar = new KickoffTabBar(this, "m_tabBar"); ++ connect(m_tabBar, SIGNAL(tabClicked(QTab*)), SLOT(tabClicked(QTab*))); ++ ++ const int tab_icon_size = 32; ++ ++ m_tabs[FavoriteTab] = new QTab; ++ m_tabBar->addTab(m_tabs[FavoriteTab]); ++ m_tabBar->setToolTip(FavoriteTab, "<qt>" + i18n( "Most commonly used applications and documents" ) + "</qt>" ); ++ m_tabs[ApplicationsTab] = new QTab; ++ m_tabBar->addTab(m_tabs[ApplicationsTab]); ++ m_tabBar->setToolTip(ApplicationsTab, "<qt>" + i18n( "List of installed applications" ) + ++ "</qt>" ); ++ ++ m_tabs[ComputerTab] = new QTab; ++ m_tabBar->addTab(m_tabs[ComputerTab]); ++ m_tabBar->setToolTip(ComputerTab, "<qt>" + i18n( "Information and configuration of your " ++ "system, access to personal files, network resources and connected disk drives") ++ + "</qt>"); ++#if 0 ++ m_tabs[SearchTab] = new QTab; ++ m_tabBar->addTab(m_tabs[SearchTab]); ++#endif ++ m_tabs[HistoryTab] = new QTab; ++ m_tabBar->addTab(m_tabs[HistoryTab]); ++ m_tabBar->setToolTip(HistoryTab, "<qt>" + i18n( "Recently used applications and documents" ) + ++ "</qt>" ); ++ m_tabs[LeaveTab] = new QTab; ++ m_tabBar->addTab(m_tabs[LeaveTab]); ++ m_tabBar->setToolTip(LeaveTab, i18n("<qt>Logout, switch user, switch off or reset," ++ " suspend of the system" ) + "</qt>" ); ++ ++ if (KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) { ++ m_tabs[FavoriteTab]->setText(workaroundStringFreeze(i18n("<p align=\"center\"> <u>F</u>avorites</p>"))); ++ m_tabs[HistoryTab]->setText(workaroundStringFreeze(i18n("<p align=\"center\"><u>H</u>istory</p>"))); ++ m_tabs[ComputerTab]->setText( ++ workaroundStringFreeze(i18n("<p align=\"center\"> <u>C</u>omputer</p>"))); ++ m_tabs[ApplicationsTab]->setText(workaroundStringFreeze(i18n("<p align=\"center\"><u>A</u>pplications</p>"))); ++ m_tabs[LeaveTab]->setText( ++ workaroundStringFreeze(i18n("<p align=\"center\"><u>L</u>eave</p>"))); ++ } ++ ++ if (KickerSettings::kickoffTabBarFormat() != KickerSettings::LabelOnly) { ++ m_tabs[FavoriteTab]->setIconSet(BarIcon("bookmark", tab_icon_size)); ++ m_tabs[HistoryTab]->setIconSet(BarIcon("recently_used", tab_icon_size)); ++ m_tabs[ComputerTab]->setIconSet(BarIcon("system", tab_icon_size)); ++ m_tabs[ApplicationsTab]->setIconSet(BarIcon("player_playlist", tab_icon_size)); ++ m_tabs[LeaveTab]->setIconSet(BarIcon("leave", tab_icon_size)); ++ } ++ ++ connect(m_tabBar, SIGNAL(selected(int)), m_stacker, SLOT(raiseWidget(int))); ++ connect(m_stacker, SIGNAL(aboutToShow(int)), m_tabBar, SLOT(setCurrentTab(int))); ++ ++ m_favoriteView = new FavoritesItemView (m_stacker, "m_favoriteView"); ++ m_favoriteView->setAcceptDrops(true); ++ m_favoriteView->setItemsMovable(true); ++ m_stacker->addWidget(m_favoriteView, FavoriteTab); ++ ++ m_recentlyView = new ItemView (m_stacker, "m_recentlyView"); ++ m_stacker->addWidget(m_recentlyView, HistoryTab); ++ ++ m_systemView = new ItemView(m_stacker, "m_systemView"); ++ m_stacker->addWidget(m_systemView, ComputerTab ); ++ ++ m_browserView = new FlipScrollView(m_stacker, "m_browserView"); ++ m_stacker->addWidget(m_browserView, ApplicationsTab); ++ connect( m_browserView, SIGNAL( backButtonClicked() ), SLOT( slotGoBack() ) ); ++ ++ m_exitView = new FlipScrollView(m_stacker, "m_exitView"); ++ m_stacker->addWidget(m_exitView, LeaveTab); ++ connect( m_exitView, SIGNAL( backButtonClicked() ), SLOT( slotGoExitMainMenu() ) ); ++ ++ m_searchWidget = new QVBox (m_stacker, "m_searchWidget"); ++ m_searchWidget->setSpacing(0); ++ m_stacker->addWidget(m_searchWidget, 5); ++ ++ // search provider icon ++ QPixmap icon; ++ KURIFilterData data; ++ QStringList list; ++ data.setData( QString("some keyword") ); ++ list << "kurisearchfilter" << "kuriikwsfilter"; ++ ++ if ( KURIFilter::self()->filterURI(data, list) ) { ++ QString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png"); ++ if ( iconPath.isEmpty() ) ++ icon = SmallIcon("enhanced_browsing"); ++ else ++ icon = QPixmap( iconPath ); ++ } ++ else ++ icon = SmallIcon("enhanced_browsing"); ++ ++ m_searchResultsWidget = new ItemView (m_searchWidget, "m_searchResultsWidget"); ++ m_searchResultsWidget->setItemMargin(4); ++ m_searchResultsWidget->setIconSize(16); ++ m_searchActions = new ItemView (m_searchWidget, "m_searchActions"); ++ m_searchActions->setFocusPolicy(QWidget::NoFocus); ++ m_searchActions->setItemMargin(4); ++ m_searchInternet = new QListViewItem(m_searchActions, i18n("Search Internet")); ++ m_searchInternet->setPixmap(0,icon); ++ setTabOrder(m_kcommand, m_searchResultsWidget); ++ ++ m_kerryInstalled = !KStandardDirs::findExe(QString::fromLatin1("kerry")).isEmpty(); ++ m_isShowing = false; ++ ++ if (!m_kerryInstalled) { ++ m_searchIndex = 0; ++ m_searchActions->setMaximumHeight(5+m_searchInternet->height()); ++ } ++ else { ++ m_searchIndex = new QListViewItem(m_searchActions, i18n("Search Index")); ++ m_searchIndex->setPixmap(0,SmallIcon("kerry")); ++ m_searchActions->setMaximumHeight(5+m_searchIndex->height()*2); ++ } ++ connect(m_searchActions, SIGNAL(clicked(QListViewItem*)), SLOT(searchActionClicked(QListViewItem*))); ++ connect(m_searchActions, SIGNAL(returnPressed(QListViewItem*)), SLOT(searchActionClicked(QListViewItem*))); ++ connect(m_searchActions, SIGNAL(spacePressed(QListViewItem*)), SLOT(searchActionClicked(QListViewItem*))); ++ ++ connect(m_searchResultsWidget, SIGNAL(startService(KService::Ptr)), SLOT(slotStartService(KService::Ptr))); ++ connect(m_searchResultsWidget, SIGNAL(startURL(const QString&)), SLOT(slotStartURL(const QString&))); ++ connect(m_searchResultsWidget, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ ++ connect(m_recentlyView, SIGNAL(startService(KService::Ptr)), SLOT(slotStartService(KService::Ptr))); ++ connect(m_recentlyView, SIGNAL(startURL(const QString&)), SLOT(slotStartURL(const QString&))); ++ connect(m_recentlyView, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ ++ connect(m_favoriteView, SIGNAL(startService(KService::Ptr)), SLOT(slotStartService(KService::Ptr))); ++ connect(m_favoriteView, SIGNAL(startURL(const QString&)), SLOT(slotStartURL(const QString&))); ++ connect(m_favoriteView, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ connect(m_favoriteView, SIGNAL(moved(QListViewItem*, QListViewItem*, QListViewItem*)), SLOT(slotFavoritesMoved( QListViewItem*, QListViewItem*, QListViewItem* ))); ++ ++ connect(m_systemView, SIGNAL(startURL(const QString&)), SLOT(slotStartURL(const QString&))); ++ connect(m_systemView, SIGNAL(startService(KService::Ptr)), SLOT(slotStartService(KService::Ptr))); ++ connect(m_systemView, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ ++ connect(m_browserView, SIGNAL(startURL(const QString&)), SLOT(slotGoSubMenu(const QString&))); ++ connect(m_browserView, SIGNAL(startService(KService::Ptr)), SLOT(slotStartService(KService::Ptr))); ++ connect(m_browserView, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ ++ connect(m_exitView, SIGNAL(startURL(const QString&)), SLOT(slotStartURL(const QString&))); ++ connect(m_exitView, SIGNAL(rightButtonPressed( QListViewItem*, const QPoint &, int )), SLOT(slotContextMenuRequested( QListViewItem*, const QPoint &, int ))); ++ ++ m_kcommand->setDuplicatesEnabled( false ); ++ m_kcommand->setLineEdit(new KLineEdit(m_kcommand, "m_kcommand-lineedit")); ++ m_kcommand->setCompletionMode( KGlobalSettings::CompletionAuto ); ++ connect(m_kcommand, SIGNAL(cleared()), SLOT(clearedHistory())); ++ connect(m_kcommand->lineEdit(), SIGNAL(returnPressed()), SLOT(searchAccept())); ++ connect(m_kcommand->lineEdit(), SIGNAL(textChanged(const QString &)), SLOT(searchChanged(const QString &))); ++ ++ // URI Filter meta object... ++ m_filterData = new KURIFilterData(); ++ ++ max_category_id = new int [num_categories]; ++ categorised_hit_total = new int [num_categories]; ++ ++ input_timer = new QTimer (this, "input_timer"); ++ connect( input_timer, SIGNAL(timeout()), this, SLOT(doQuery()) ); ++ ++ init_search_timer = new QTimer (this, "init_search_timer"); ++ connect( init_search_timer, SIGNAL(timeout()), this, SLOT(initSearch()) ); ++ init_search_timer->start(2000, true); ++ ++ connect( m_favoriteView, SIGNAL( dropped (QDropEvent *, QListViewItem * ) ), ++ SLOT( slotFavDropped( QDropEvent *, QListViewItem * ) ) ); ++ ++ this->installEventFilter(this); ++ m_tabBar->installEventFilter(this); ++ m_favoriteView->installEventFilter(this); ++ m_recentlyView->installEventFilter(this); ++ m_browserView->leftView()->installEventFilter(this); ++ m_browserView->rightView()->installEventFilter(this); ++ m_systemView->installEventFilter(this); ++ m_exitView->leftView()->installEventFilter(this); ++ m_exitView->rightView()->installEventFilter(this); ++ m_kcommand->lineEdit()->installEventFilter(this); ++ m_searchLabel->installEventFilter(this); ++ m_searchPixmap->installEventFilter(this); ++ m_stacker->installEventFilter(this); ++ ++ emailRegExp = QRegExp("^([\\w\\-]+\\.)*[\\w\\-]+@([\\w\\-]+\\.)*[\\w\\-]+$"); ++ authRegExp = QRegExp("^[a-zA-Z]+://\\w+(:\\w+)?@([\\w\\-]+\\.)*[\\w\\-]+(:\\d+)?(/.*)?$"); ++ uriRegExp = QRegExp("^[a-zA-Z]+://([\\w\\-]+\\.)*[\\w\\-]+(:\\d+)?(/.*)?$"); ++ uri2RegExp = QRegExp("^([\\w\\-]+\\.)+[\\w\\-]+(:\\d+)?(/.*)?$"); ++ ++ m_resizeHandle = new QLabel(this); ++ m_resizeHandle->setBackgroundOrigin( QLabel::ParentOrigin ); ++ m_resizeHandle->setScaledContents(true); ++ m_resizeHandle->setFixedSize( 16, 16 ); ++ m_searchFrame->stackUnder( m_resizeHandle ); ++ m_isresizing = false; ++ ++ m_searchPixmap->setPixmap( BarIcon( "find", 32 ) ); ++ ++ QFont f = font(); ++ f.setPointSize( kMax( 7, (f.pointSize() * 4 / 5 ) + KickerSettings::kickoffFontPointSizeOffset() ) ); ++ m_tabBar->setFont ( f ); ++ f.setPointSize( kMax( 7, (f.pointSize() * 3 / 2 ) + KickerSettings::kickoffFontPointSizeOffset() ) ); ++ m_searchLabel->setFont( f ); ++ ++ static_cast<KLineEdit*>(m_kcommand->lineEdit())->setClickMessage(i18n( "Applications, Contacts and Documents" ) ); ++ ++ bookmarkManager = 0; ++ m_addressBook = 0; ++ m_popupMenu = 0; ++ ++ main_border_tl.load( locate("data", "kicker/pics/main_corner_tl.png" ) ); ++ main_border_tr.load( locate("data", "kicker/pics/main_corner_tr.png" ) ); ++ ++ search_tab_left.load( locate("data", "kicker/pics/search-tab-left.png" ) ); ++ search_tab_right.load( locate("data", "kicker/pics/search-tab-right.png" ) ); ++ search_tab_center.load( locate("data", "kicker/pics/search-tab-center.png" ) ); ++ ++ search_tab_top_left.load( locate("data", "kicker/pics/search-tab-top-left.png" ) ); ++ search_tab_top_right.load( locate("data", "kicker/pics/search-tab-top-right.png" ) ); ++ search_tab_top_center.load( locate("data", "kicker/pics/search-tab-top-center.png" ) ); ++} ++ ++void KMenu::setupUi() ++{ ++ m_stacker = new QWidgetStack( this, "m_stacker" ); ++ m_stacker->setGeometry( QRect( 90, 260, 320, 220 ) ); ++ m_stacker->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)3, 1, 1, m_stacker->sizePolicy().hasHeightForWidth() ) ); ++ m_stacker->setPaletteBackgroundColor( QColor( 255, 255, 255 ) ); ++ // m_stacker->setFocusPolicy( QWidget::StrongFocus ); ++ m_stacker->setLineWidth( 0 ); ++ m_stacker->setFocusPolicy(QWidget::NoFocus); ++ connect(m_stacker, SIGNAL(aboutToShow(QWidget*)), SLOT(stackWidgetRaised(QWidget*))); ++ ++ m_kcommand->setName("m_kcommand"); ++} ++ ++KMenu::~KMenu() ++{ ++ saveConfig(); ++ ++ clearSubmenus(); ++ delete m_filterData; ++} ++ ++bool KMenu::eventFilter ( QObject * receiver, QEvent* e) ++{ ++//kdDebug() << "eventFilter receiver=" << receiver->name() << " type=" << e->type() << endl; ++ QWidget* raiseWidget = 0; ++ QRect raiseRect; ++ ++ if (e->type() == QEvent::KeyPress || ++ e->type() == QEvent::MouseButtonPress || ++ e->type() == QEvent::MouseMove ++ || e->type() == QEvent::FocusIn ++ || e->type() == QEvent::Wheel) { ++ QPoint p; ++ ++ if (e->type() == QEvent::MouseMove || e->type() == QEvent::MouseButtonPress) { ++ QMouseEvent* me = static_cast<QMouseEvent*>(e); ++ p = me->globalPos(); ++ } ++ else if (e->type() == QEvent::Wheel) { ++ QWheelEvent* we = static_cast<QWheelEvent*>(e); ++ p = we->globalPos(); ++ } ++ ++ while (receiver) { ++ if (receiver == m_tabBar && (e->type()!=QEvent::MouseMove || KickerSettings::kickoffSwitchTabsOnHover() ) ) { ++ QTab* s = m_tabBar->selectTab(m_tabBar->mapFromGlobal(p)); ++ if (s && s->identifier() == ApplicationsTab) ++ raiseWidget = m_browserView; ++ if (s && s->identifier() == FavoriteTab) ++ raiseWidget = m_favoriteView; ++ if (s && s->identifier() == HistoryTab) ++ raiseWidget = m_recentlyView; ++ if (s && s->identifier() == ComputerTab) ++ raiseWidget = m_systemView; ++ if (s && s->identifier() == LeaveTab) ++ raiseWidget = m_exitView; ++ ++ if (raiseWidget) ++ raiseRect = QRect( m_tabBar->mapToGlobal(s->rect().topLeft()), ++ s->rect().size()); ++ } ++ ++ /* we do not want hover activation for the search line edit as this can be ++ * pretty disturbing */ ++ if ( (receiver == m_searchPixmap || ++ ( ( receiver == m_searchLabel || receiver==m_kcommand->lineEdit() ) && ++ ( e->type() == QEvent::KeyPress || e->type() == QEvent::Wheel ++ || e->type() == QEvent::MouseButtonPress ) ) ) && ++ !m_isShowing) { ++ raiseWidget = m_searchWidget; ++ raiseRect = QRect( m_searchFrame->mapToGlobal(m_searchFrame->rect().topLeft()), ++ m_searchFrame->size()); ++ } ++ ++ if(raiseWidget) ++ break; ++ if(receiver->isWidgetType()) ++ receiver = static_cast<QWidget*>(receiver)->parentWidget(true); ++ else ++ break; ++ } ++ ++ if (e->type() == QEvent::FocusIn && receiver && raiseWidget) { ++ m_searchResultsWidget->setFocusPolicy(QWidget::StrongFocus); ++ m_searchActions->setFocusPolicy(raiseWidget == m_searchWidget ? ++ QWidget::StrongFocus : QWidget::NoFocus); ++ setTabOrder(raiseWidget, m_searchResultsWidget); ++ if (raiseWidget != m_stacker->visibleWidget() ++ && static_cast<QWidget*>(receiver)->focusPolicy() == QWidget::NoFocus ++ && m_stacker->id(raiseWidget) >= 0) { ++ ++ m_stacker->raiseWidget(raiseWidget); ++ return true; ++ } ++ ++ if (raiseWidget->focusPolicy() != QWidget::NoFocus) ++ return false; ++ } ++ ++ if (m_sloppyRegion.contains(p)) { ++ if (e->type() == QEvent::MouseButtonPress /*&& m_sloppyTimer.isActive()*/) ++ m_sloppySourceClicked = true; ++ ++ if (!m_sloppyTimer.isActive() || m_sloppySource != raiseRect) { ++ int timeout= style().styleHint(QStyle::SH_PopupMenu_SubMenuPopupDelay); ++ if (m_sloppySourceClicked) ++ timeout = 3000; ++ m_sloppyTimer.start(timeout); ++ } ++ ++ m_sloppyWidget = raiseWidget; ++ m_sloppySource = raiseRect; ++ return false; ++ } ++ } ++ ++ if(e->type() == QEvent::Enter && receiver->isWidgetType()) { ++ static_cast<QWidget*>(receiver)->setMouseTracking(true); ++ QToolTip::hide(); ++ } ++ ++ if ( ( e->type() == QEvent::DragEnter || e->type() == QEvent::DragMove ) && ++ raiseWidget == m_favoriteView ) ++ { ++ m_stacker->raiseWidget(m_favoriteView); ++ ++ return false; ++ } ++ ++ // This is a nightmare of a hack, look away. Logic needs ++ // to be moved to the stacker and all widgets in the stacker ++ // must have focusNextPrevChild() overwritten to do nothing ++ if (e->type() == QEvent::KeyPress && !raiseRect.isNull()) { ++ ItemView* view; ++ if (m_browserView==m_stacker->visibleWidget()) ++ view = m_browserView->currentView(); ++ else if (m_exitView==m_stacker->visibleWidget()) ++ view = m_exitView->currentView(); ++ else ++ view = dynamic_cast<ItemView*>(m_stacker->visibleWidget()); ++ ++ if (view) ++ { ++ bool handled = true; ++ switch (static_cast<QKeyEvent*>(e)->key()) { ++ case Key_Up: ++ if (view->selectedItem()) { ++ view->setSelected(view->selectedItem()->itemAbove(),true); ++ } ++ else { ++ view->setSelected(view->lastItem(),true); ++ } ++ break; ++ case Key_Down: ++ if (view->selectedItem()) { ++ view->setSelected(view->selectedItem()->itemBelow(),true); ++ } ++ else { ++ if (view->firstChild() && view->firstChild()->isSelectable()) ++ view->setSelected(view->firstChild(),true); ++ else if (view->childCount()>2) ++ view->setSelected(view->firstChild()->itemBelow(),true); ++ } ++ break; ++ case Key_Right: ++ if (view->selectedItem() && !static_cast<KMenuItem*>(view->selectedItem())->hasChildren()) ++ break; ++ // nobreak ++ case Key_Enter: ++ case Key_Return: ++ if (view->selectedItem()) ++ view->slotItemClicked(view->selectedItem()); ++ ++ break; ++ case Key_Left: ++ if (m_browserView == m_stacker->visibleWidget() || m_exitView == m_stacker->visibleWidget()) { ++ FlipScrollView* flip = dynamic_cast<FlipScrollView*>(m_stacker->visibleWidget()); ++ if (flip->showsBackButton()) { ++ if (m_browserView == m_stacker->visibleWidget()) ++ goSubMenu( m_browserView->currentView()->backPath(), true ); ++ else ++ view->slotItemClicked(view->firstChild()); ++ } ++ break; ++ } ++ // nobreak ++ case Key_Backspace: ++ if (m_browserView == m_stacker->visibleWidget() || m_exitView == m_stacker->visibleWidget()) { ++ FlipScrollView* flip = dynamic_cast<FlipScrollView*>(m_stacker->visibleWidget()); ++ if (flip->showsBackButton()) { ++ if (m_browserView == m_stacker->visibleWidget()) ++ goSubMenu( m_browserView->currentView()->backPath(), true ); ++ else ++ view->slotItemClicked(view->firstChild()); ++ } ++ } ++ ++ break; ++ default: ++ handled = false; ++ } ++ ++ if (handled) ++ view->ensureItemVisible(view->selectedItem()); ++ ++ return handled; ++ } ++ } ++ ++ bool r = KMenuBase::eventFilter(receiver, e); ++ ++ if (!r && raiseWidget) ++ m_stacker->raiseWidget(raiseWidget); ++ ++ if (e->type() == QEvent::Wheel && raiseWidget ) ++ { ++ // due to an ugly Qt bug we have to kill wheel events ++ // that cause focus switches ++ r = true; ++ } ++ ++ if (e->type() == QEvent::Enter && receiver == m_stacker) ++ { ++ QRect r(m_stacker->mapToGlobal(QPoint(-8,-32)), m_stacker->size()); ++ r.setSize(r.size()+QSize(16,128)); ++ ++ m_sloppyRegion = QRegion(r); ++ } ++ ++ // redo the sloppy region ++ if (e->type() == QEvent::MouseMove && !r && raiseWidget) ++ { ++ QPointArray points(4); ++ ++ // hmm, eventually this should be mouse position + 10px, not ++ // just worst case. but worst case seems to work fine enough. ++ QPoint edge(raiseRect.topLeft()); ++ edge.setX(edge.x()+raiseRect.center().x()); ++ ++ if (m_orientation == BottomUp) ++ { ++ points.setPoint(0, m_stacker->mapToGlobal(m_stacker->rect().bottomLeft())); ++ points.setPoint(1, m_stacker->mapToGlobal(m_stacker->rect().bottomRight())); ++ ++ edge.setY(edge.y()+raiseRect.height()); ++ points.setPoint(2, edge+QPoint(+raiseRect.width()/4,0)); ++ points.setPoint(3, edge+QPoint(-raiseRect.width()/4,0)); ++ } ++ else ++ { ++ points.setPoint(0, m_stacker->mapToGlobal(m_stacker->rect().topLeft())); ++ points.setPoint(1, m_stacker->mapToGlobal(m_stacker->rect().topRight())); ++ points.setPoint(2, edge+QPoint(-raiseRect.width()/4,0)); ++ points.setPoint(3, edge+QPoint(+raiseRect.width()/4,0)); ++ } ++ ++ m_sloppyRegion = QRegion(points); ++ } ++ ++ return r; ++} ++ ++void KMenu::slotSloppyTimeout() ++{ ++ if (m_sloppyRegion.contains(QCursor::pos()) && !m_sloppySource.isNull()) ++ { ++ if ( m_sloppySource.contains(QCursor::pos())) ++ { ++ m_stacker->raiseWidget(m_sloppyWidget); ++ ++ m_sloppyWidget = 0; ++ m_sloppySource = QRect(); ++ m_sloppyRegion = QRegion(); ++ m_sloppySourceClicked = false; ++ } ++ } ++ m_sloppyTimer.stop(); ++} ++ ++void KMenu::paintSearchTab( bool active ) ++{ ++ QPixmap canvas( m_searchFrame->size() ); ++ QPainter p( &canvas ); ++ ++ QPixmap pix; ++ ++ if ( m_orientation == BottomUp ) ++ pix.load( locate("data", "kicker/pics/search-gradient.png" ) ); ++ else ++ pix.load( locate("data", "kicker/pics/search-gradient-topdown.png" ) ); ++ ++ pix.convertFromImage( pix.convertToImage().scale(pix.width(), m_searchFrame->height())); ++ p.drawTiledPixmap( 0, 0, m_searchFrame->width(), m_searchFrame->height(), pix ); ++ ++ if ( active ) { ++ ++ m_tabBar->deactivateTabs(true); ++ ++ p.setBrush( Qt::white ); ++ p.setPen( Qt::NoPen ); ++ ++ if ( m_orientation == BottomUp ) { ++ search_tab_center.convertFromImage( search_tab_center.convertToImage().scale(search_tab_center.width(), m_searchFrame->height())); ++ p.drawTiledPixmap( search_tab_left.width(), 0, m_searchFrame->width()-search_tab_left.width()-search_tab_right.width(), m_searchFrame->height(), search_tab_center ); ++ ++ search_tab_left.convertFromImage( search_tab_left.convertToImage().scale(search_tab_left.width(), m_searchFrame->height())); ++ p.drawPixmap( 0, 0, search_tab_left ); ++ ++ search_tab_right.convertFromImage( search_tab_right.convertToImage().scale(search_tab_right.width(), m_searchFrame->height())); ++ p.drawPixmap( m_searchFrame->width()-search_tab_right.width(), 0, search_tab_right ); ++ } ++ else { ++ search_tab_top_center.convertFromImage( search_tab_top_center.convertToImage().scale(search_tab_top_center.width(), m_searchFrame->height())); ++ p.drawTiledPixmap( search_tab_top_left.width(), 0, m_searchFrame->width()-search_tab_top_left.width()-search_tab_top_right.width(), m_searchFrame->height(), search_tab_top_center ); ++ ++ search_tab_top_left.convertFromImage( search_tab_top_left.convertToImage().scale(search_tab_top_left.width(), m_searchFrame->height())); ++ p.drawPixmap( 0, 0, search_tab_top_left ); ++ ++ search_tab_top_right.convertFromImage( search_tab_top_right.convertToImage().scale(search_tab_top_right.width(), m_searchFrame->height())); ++ p.drawPixmap( m_searchFrame->width()-search_tab_top_right.width(), 0, search_tab_top_right ); ++ } ++ } ++ else ++ m_tabBar->deactivateTabs(false); ++ ++ p.end(); ++ m_searchFrame->setPaletteBackgroundPixmap( canvas ); ++} ++ ++void KMenu::stackWidgetRaised(QWidget* raiseWidget) ++{ ++ paintSearchTab(raiseWidget == m_searchWidget); ++ ++ if (raiseWidget == m_browserView) { ++ if ( m_tabBar->currentTab() == ApplicationsTab) ++ slotGoSubMenu(QString::null); ++ if (m_browserDirty ) { ++ createNewProgramList(); ++ m_browserView->prepareRightMove(); ++ m_browserView->currentView()->clear(); ++ fillSubMenu(QString::null, m_browserView->currentView()); ++ m_browserDirty = false; ++ } ++ } ++ else if (raiseWidget == m_recentlyView) { ++ if (m_recentDirty) ++ updateRecent(); ++ } ++ else if (raiseWidget == m_exitView) { ++ if (m_tabBar->currentTab() == LeaveTab) ++ slotGoExitMainMenu(); ++ } ++ ++ ++#warning Qtab fixme ++#if 0 ++ else if (raiseWidget == m_systemView) ++ frame = m_system; ++ else if (raiseWidget == m_favoriteView) ++ frame = m_btnFavorites; ++ if (!frame) ++ return; ++ ++ if ( m_activeTab == frame ) ++ return; ++ ++ paintTab( m_activeTab, false ); ++ paintTab( frame, true ); ++ ++ // if (dynamic_cast<QScrollView*>(raiseWidget)) ++ // m_activeTab->setFocusProxy(static_cast<QScrollView*>(raiseWidget)->viewport()); ++ ++ if (0 && /*raiseWidget == m_stacker->visibleWidget() &&*/ !raiseWidget->hasFocus()) { ++ ++ if (dynamic_cast<QScrollView*>(raiseWidget)) ++ static_cast<QScrollView*>(raiseWidget)->viewport()->setFocus(); ++ else ++ raiseWidget->setFocus(); ++ } ++ ++ m_activeTab = frame; ++ ++ m_sloppyRegion = QRegion(); ++ m_sloppyTimer.stop(); ++ ++ ItemView* view; ++ if (raiseWidget == m_browserView) ++ view = m_browserView->currentView(); ++ else if (raiseWidget == m_exitView) ++ view = m_exitView->currentView(); ++ else ++ view = dynamic_cast<ItemView*>(m_stacker->visibleWidget()); ++ if (view && !view->selectedItem()) { ++ if (view->firstChild() && view->firstChild()->isSelectable()) { ++ view->setSelected(view->firstChild(),true); ++ } ++ else if (view->childCount()>1) { ++ view->setSelected(view->firstChild()->itemBelow(),true); ++ } ++ } ++#endif ++} ++ ++void KMenu::paletteChanged() ++{ ++} ++ ++void KMenu::tabClicked(QTab* t) ++{ ++ if (t==m_tabs[ApplicationsTab]) ++ slotGoSubMenu(QString::null); ++ else if (t==m_tabs[LeaveTab]) ++ slotGoExitMainMenu(); ++} ++ ++void KMenu::slotGoBack() ++{ ++ goSubMenu( m_browserView->currentView()->backPath() ); ++} ++ ++void KMenu::slotGoExitMainMenu() ++{ ++ if (m_exitView->currentView()==m_exitView->rightView()) { ++ m_exitView->prepareLeftMove(false); ++ m_exitView->showBackButton(false); ++ m_exitView->flipScroll(QString::null); ++ } ++} ++ ++void KMenu::slotGoExitSubMenu(const QString& url) ++{ ++ m_exitView->prepareRightMove(); ++ m_exitView->showBackButton(true); ++ ++ int nId = serviceMenuEndId() + 1; ++ int index = 1; ++ ++ if (url=="kicker:/restart/") { ++ QStringList rebootOptions; ++ int def, cur; ++ if ( DM().bootOptions( rebootOptions, def, cur ) ) ++ { ++ if ( cur == -1 ) ++ cur = def; ++ ++ int boot_index = 0; ++ QStringList::ConstIterator it = rebootOptions.begin(); ++ for (; it != rebootOptions.end(); ++it, ++boot_index) ++ { ++ ++ QString option = i18n( "Start '%1'" ).arg( *it ); ++ if (boot_index == cur) ++ option = i18n("Start '%1' (current)").arg( *it ); ++ m_exitView->rightView()->insertItem( "reload", option, ++ i18n( "Restart and boot directly into '%1'").arg( *it ), ++ QString( "kicker:/restart_%1" ).arg( boot_index ), nId++, index++ ); ++ } ++ m_exitView->rightView()->insertHeader( nId++, "kicker:/restart/" ); ++ } ++ } ++ else /*if (url=="kicker:/switchuser/") */{ ++ m_exitView->rightView()->insertItem( "switchuser", i18n( "Start New Session" ), ++ i18n( "Start a parallel session" ), "kicker:/switchuser", nId++, index++ ); ++ ++ m_exitView->rightView()->insertItem( "lock", i18n( "Lock Current && Start New Session").replace("&&","&"), ++ i18n( "Lock screen and start a parallel session" ), "kicker:/switchuserafterlock", nId++, index++ ); ++ ++ SessList sess; ++ if (DM().localSessions( sess )) { ++ if (sess.count()>1) ++ m_exitView->rightView()->insertSeparator( nId++, QString::null, index++ ); ++ for (SessList::ConstIterator it = sess.begin(); it != sess.end(); ++it) { ++ if ((*it).vt && !(*it).self) { ++ QString user, loc; ++ DM().sess2Str2( *it, user, loc ); ++ QStringList list = QStringList::split(":", user); ++ m_exitView->rightView()->insertItem( "switchuser", i18n( "Switch to Session of User '%1'").arg(list[0]), ++ i18n("Session: %1").arg(list[1].mid(1)+", "+loc) , QString("kicker:/switchuser_%1").arg((*it).vt), nId++, index++ ); ++ } ++ } ++ } ++ ++ m_exitView->rightView()->insertHeader( nId++, "kicker:/switchuser/" ); ++ } ++ m_exitView->flipScroll(QString::null); ++} ++ ++void KMenu::slotGoSubMenu(const QString& relPath) ++{ ++ goSubMenu(relPath); ++} ++ ++void KMenu::goSubMenu(const QString& relPath, bool keyboard) ++{ ++ if ( relPath.startsWith( "kicker:/goup/" ) ) ++ { ++ QString rel = relPath.mid( strlen( "kicker:/goup/" ) ); ++ int index = rel.length() - 1; ++ if ( rel.endsWith( "/" ) ) ++ index--; ++ index = rel.findRev( '/', index ); ++ kdDebug() << "goup, rel '" << rel << "' " << index << endl; ++ QString currel = rel; ++ rel = rel.left( index + 1 ); ++ if ( rel == "/" ) ++ rel = QString::null; ++ ++ kdDebug() << "goup, rel '" << rel << "' " << rel.isEmpty() << endl; ++ fillSubMenu( rel, m_browserView->prepareLeftMove() ); ++ m_browserView->flipScroll(keyboard ? currel : QString::null); ++ return; ++ } else if (relPath.isEmpty()) ++ { ++ if (m_browserView->currentView()->path.isEmpty()) ++ return; ++ fillSubMenu( relPath, m_browserView->prepareLeftMove() ); ++ } else if ( relPath.startsWith( "kicker:/new/" ) ) ++ { ++ ItemView* view = m_browserView->prepareRightMove(); ++ m_browserView->showBackButton( true ); ++ ++ int nId = serviceMenuEndId() + 1; ++ view->insertHeader( nId++, "new/" ); ++ int index = 2; ++ for (QStringList::ConstIterator it = m_newInstalledPrograms.begin(); ++ it != m_newInstalledPrograms.end(); ++it) { ++ KService::Ptr p = KService::serviceByStorageId((*it)); ++ view->insertMenuItem(p, nId++, index++); ++ } ++ } else ++ { ++ //m_browserView->clear(); ++ fillSubMenu(relPath, m_browserView->prepareRightMove()); ++ } ++ m_browserView->flipScroll(keyboard ? "kicker:/goup/": QString::null); ++} ++ ++void KMenu::fillSubMenu(const QString& relPath, ItemView *view) ++{ ++ kdDebug() << "fillSubMenu() " << relPath << endl; ++ KServiceGroup::Ptr root = KServiceGroup::group(relPath); ++ Q_ASSERT( root ); ++ ++ KServiceGroup::List list = root->entries(true, true, true, KickerSettings:: ++ menuEntryFormat() == KickerSettings::DescriptionAndName || KickerSettings::menuEntryFormat() ++ == KickerSettings::DescriptionOnly); ++ ++ int nId = serviceMenuStartId(); ++ m_browserView->showBackButton( !relPath.isEmpty() ); ++ if ( !relPath.isEmpty() ) ++ { ++ view->insertHeader( nId++, relPath ); ++ } ++ else if ( m_newInstalledPrograms.count() ) { ++ KMenuItem *item = view->insertItem( "clock", i18n( "New Applications" ), ++ QString::null, "kicker:/new/", nId++, -1 ); ++ item->setHasChildren( true ); ++ view->insertSeparator( nId++, QString::null, -1 ); ++ } ++ ++ view->path = relPath; ++ ++ fillMenu (root, list, relPath, view, nId); ++} ++ ++void KMenu::fillMenu(KServiceGroup::Ptr& ++#ifdef KDELIBS_SUSE ++ _root ++#endif ++ , KServiceGroup::List& _list, ++ const QString& _relPath, ++ ItemView* view, ++ int& id) ++{ ++ bool separatorNeeded = false; ++ KServiceGroup::List::ConstIterator it = _list.begin(); ++#ifdef KDELIBS_SUSE ++ KSortableValueList<KSharedPtr<KSycocaEntry>,QCString> slist; ++ KSortableValueList<KSharedPtr<KSycocaEntry>,QCString> glist; ++ QMap<QString,QString> specialTitle; ++ QMap<QString,QString> categoryIcon; ++ QMap<QString,QString> shortenedMenuPath; ++#endif ++ ++ for (; it != _list.end(); ++it) ++ { ++ KSycocaEntry * e = *it; ++ ++ if (e->isType(KST_KServiceGroup)) ++ { ++ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++#ifdef KDELIBS_SUSE ++ if ( true /*KickerSettings::reduceMenuDepth()*/ && g->SuSEshortMenu() ){ ++ KServiceGroup::List l = g->entries(true, true /*excludeNoDisplay_*/ ); ++ if ( l.count() == 1 ) { ++ // the special case, we want to short the menu. ++ // TOFIX? : this works only for one level ++ KServiceGroup::List::ConstIterator _it=l.begin(); ++ KSycocaEntry *_e = *_it; ++ if (_e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(_e)); ++ QString key; ++ if ( g->SuSEgeneralDescription() ) { ++ // we use the application name ++ key = s->name(); ++ } ++ else { ++ // we use the normal menu description ++ key = s->name(); ++ if( !s->genericName().isEmpty() && g->caption()!=s->genericName()) { ++ if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) ++ key = s->name() + " (" + g->caption() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) ++ key = g->caption() + " (" + s->name() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) ++ key = g->caption(); ++ } ++ } ++ specialTitle.insert( _e->name(), key ); ++ categoryIcon.insert( _e->name(), g->icon() ); ++ slist.insert( key.local8Bit(), _e ); ++ shortenedMenuPath.insert( _e->name(), g->relPath() ); ++ // and escape from here ++ continue; ++ } ++ } ++ } ++ glist.insert( g->caption().local8Bit(), e ); ++ }else if( e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(e)); ++ slist.insert( s->name().local8Bit(), e ); ++ } else ++ slist.insert( e->name().local8Bit(), e ); ++ } ++ ++ _list = _root->SuSEsortEntries( slist, glist, true /*excludeNoDisplay_*/, true ); ++ it = _list.begin(); ++ ++ for (; it != _list.end(); ++it) { ++ ++ KSycocaEntry * e = *it; ++ ++ if (e->isType(KST_KServiceGroup)) { ++ ++ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++ if ( true /*KickerSettings::reduceMenuDepth()*/ && g->SuSEshortMenu() ){ ++ KServiceGroup::List l = g->entries(true, true /*excludeNoDisplay_*/ ); ++ if ( l.count() == 1 ) { ++ continue; ++ } ++ } ++ // standard sub menu ++#endif ++ QString groupCaption = g->caption(); ++ ++ // Avoid adding empty groups. ++ KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(g->relPath()); ++ ++ int nbChildCount = subMenuRoot->childCount(); ++ if (nbChildCount == 0 && !g->showEmptyMenu()) ++ { ++ continue; ++ } ++ ++ bool is_description = KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName || ++ KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly; ++ ++ QString inlineHeaderName = g->showInlineHeader() ? groupCaption : ""; ++ ++ if ( nbChildCount == 1 && g->allowInline() && g->inlineAlias()) ++ { ++ KServiceGroup::Ptr element = KServiceGroup::group(g->relPath()); ++ if ( element ) ++ { ++ //just one element ++ ++ KServiceGroup::List listElement = element->entries(true, true, true, is_description ); ++ KSycocaEntry * e1 = *( listElement.begin() ); ++ if ( e1->isType( KST_KService ) ) ++ { ++ KService::Ptr s(static_cast<KService *>(e1)); ++ view->insertMenuItem(s, id++, -1, 0); ++ continue; ++ } ++ } ++ } ++ ++ if (g->allowInline() && ((nbChildCount <= g->inlineValue() ) || (g->inlineValue() == 0))) ++ { ++ //inline all entries ++ KServiceGroup::Ptr rootElement = KServiceGroup::group(g->relPath()); ++ ++ if (!rootElement || !rootElement->isValid()) ++ { ++ break; ++ } ++ ++ ++ KServiceGroup::List listElement = rootElement->entries(true, true, true, is_description ); ++ ++#if 0 ++ if ( !g->inlineAlias() && !inlineHeaderName.isEmpty() ) ++ { ++ int mid = view->insertItem(new PopupMenuTitle(inlineHeaderName, font()), id++, id, 0); ++ m_browserView->setItemEnabled( mid, false ); ++ } ++#endif ++ ++ fillMenu( rootElement, listElement, g->relPath(), 0, id ); ++ continue; ++ } ++ ++ // Ignore dotfiles. ++ if ((g->name().at(0) == '.')) ++ { ++ continue; ++ } ++ ++ KMenuItem *item = view->insertItem(g->icon(), groupCaption, QString::null, g->relPath(), id++, -1); ++ item->setMenuPath(g->relPath()); ++ item->setHasChildren( true ); ++ ++#warning FIXME ++#if 0 ++ PanelServiceMenu * m = ++ newSubMenu(g->name(), g->relPath(), this, g->name().utf8(), inlineHeaderName); ++ m->setCaption(groupCaption); ++ ++ QIconSet iconset = KickerLib::menuIconSet(g->icon()); ++ ++ if (separatorNeeded) ++ { ++ insertSeparator(); ++ separatorNeeded = false; ++ } ++ ++ int newId = insertItem(iconset, groupCaption, m, id++); ++ entryMap_.insert(newId, static_cast<KSycocaEntry*>(g)); ++ // We have to delete the sub menu our selves! (See Qt docs.) ++ subMenus.append(m); ++#endif ++ } ++ if (e->isType(KST_KService)) ++ { ++ KService::Ptr s(static_cast<KService *>(e)); ++ if (_relPath.isEmpty()) { ++ QStringList favs = KickerSettings::favorites(); ++ if (favs.find(s->storageId())!=favs.end()) ++ continue; ++ } ++#ifdef KDELIBS_SUSE ++ KMenuItem *item = view->insertMenuItem(s, id++, -1, 0, QString::null, specialTitle[s->name()], categoryIcon[s->name()] ); ++ if (shortenedMenuPath[s->name()].isEmpty()) ++ item->setMenuPath(_relPath+s->menuId()); ++ else ++ item->setMenuPath(shortenedMenuPath[s->name()]+s->menuId()); ++#else ++ KMenuItem *item = view->insertMenuItem(s, id++, -1); ++ item->setMenuPath(_relPath+s->menuId()); ++#endif ++ } ++ else if (e->isType(KST_KServiceSeparator)) ++ { ++ separatorNeeded = true; ++ } ++ } ++ ++ view->slotMoveContent(); ++} ++ ++void KMenu::initialize() ++{ ++ static bool m_initialized=false; ++ if (m_initialized) ++ return; ++ m_initialized = true; ++ ++ kdDebug(1210) << "KMenu::initialize()" << endl; ++ ++ // in case we've been through here before, let's disconnect ++ disconnect(kapp, SIGNAL(kdisplayPaletteChanged()), ++ this, SLOT(paletteChanged())); ++ connect(kapp, SIGNAL(kdisplayPaletteChanged()), ++ this, SLOT(paletteChanged())); ++ ++ /* ++ If the user configured ksmserver to ++ */ ++ KConfig ksmserver("ksmserverrc", false, false); ++ ksmserver.setGroup("General"); ++ connect( m_branding, SIGNAL(clicked()), SLOT(slotOpenHomepage())); ++ m_tabBar->setTabEnabled(LeaveTab, kapp->authorize("logout")); ++ ++ // load search field history ++ QStringList histList = KickerSettings::history(); ++ int maxHistory = KickerSettings::historyLength(); ++ ++ bool block = m_kcommand->signalsBlocked(); ++ m_kcommand->blockSignals( true ); ++ m_kcommand->setMaxCount( maxHistory ); ++ m_kcommand->setHistoryItems( histList ); ++ m_kcommand->blockSignals( block ); ++ ++ QStringList compList = KickerSettings::completionItems(); ++ if( compList.isEmpty() ) ++ m_kcommand->completionObject()->setItems( histList ); ++ else ++ m_kcommand->completionObject()->setItems( compList ); ++ ++ KCompletionBox* box = m_kcommand->completionBox(); ++ if (box) ++ box->setActivateOnSelect( false ); ++ ++ m_finalFilters = KURIFilter::self()->pluginNames(); ++ m_finalFilters.remove("kuriikwsfilter"); ++ ++ m_middleFilters = m_finalFilters; ++ m_middleFilters.remove("localdomainurifilter"); ++ ++ QStringList favs = KickerSettings::favorites(); ++ if (favs.isEmpty()) { ++ QFile f(locate("data", "kicker/default-favs")); ++ if (f.open(IO_ReadOnly)) { ++ QTextStream is(&f); ++ ++ while (!is.eof()) ++ favs << is.readLine(); ++ ++ f.close(); ++ } ++ KickerSettings::setFavorites(favs); ++ KickerSettings::writeConfig(); ++ } ++ ++ int nId = serviceMenuEndId() + 1; ++ int index = 1; ++ for (QStringList::ConstIterator it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/') { ++ KDesktopFile df((*it),true); ++ QString url = df.readURL(); ++ if (!KURL(url).isLocalFile() || QFile::exists(url.replace("file://",QString::null))) ++ m_favoriteView->insertItem(df.readIcon(),df.readName(),df.readGenericName(), url, nId++, index++); ++ } ++ else { ++ KService::Ptr p = KService::serviceByStorageId((*it)); ++ m_favoriteView->insertMenuItem(p, nId++, index++); ++ } ++ } ++ ++ //nId = m_favoriteView->insertSeparator( nId, QString::null, index++ ); ++// m_favoriteView->insertDocument(KURL("help:/khelpcenter/userguide/index.html"), nId++); ++ ++ insertStaticItems(); ++ ++ m_stacker->raiseWidget (m_favoriteView); ++} ++ ++void KMenu::insertStaticExitItems() ++{ ++ int nId = serviceMenuEndId() + 1; ++ int index = 1; ++ ++ m_exitView->leftView()->insertSeparator( nId++, i18n("Session"), index++ ); ++ if (kapp->authorize("logout")) ++ m_exitView->leftView()->insertItem( "undo", i18n( "Logout" ), ++ i18n( "End session" ), "kicker:/logout", nId++, index++ ); ++ if (kapp->authorize("lock_screen")) ++ m_exitView->leftView()->insertItem( "lock", i18n( "Lock" ), ++ i18n( "Lock screen" ), "kicker:/lock", nId++, index++ ); ++ ++ KConfig ksmserver("ksmserverrc", false, false); ++ ksmserver.setGroup("General"); ++ if (ksmserver.readEntry( "loginMode" ) == "restoreSavedSession") ++ { ++ m_exitView->leftView()->insertItem("filesave", i18n("Save Session"), ++ i18n("Save current Session for next login"), ++ "kicker:/savesession", nId++, index++ ); ++ } ++ if (DM().isSwitchable() && kapp->authorize("switch_user")) ++ { ++ KMenuItem *switchuser = m_exitView->leftView()->insertItem( "switchuser", i18n( "Switch User" ), ++ i18n( "Manage parallel sessions" ), "kicker:/switchuser/", nId++, index++ ); ++ switchuser->setHasChildren(true); ++ } ++ ++ bool maysd = false; ++ if (ksmserver.readBoolEntry( "offerShutdown", true ) && DM().canShutdown()) ++ maysd = true; ++ ++ if ( maysd ) ++ { ++ m_exitView->leftView()->insertSeparator( nId++, i18n("System"), index++ ); ++ m_exitView->leftView()->insertItem( "exit", i18n( "Shutdown Computer" ), ++ i18n( "Turn off computer" ), "kicker:/shutdown", nId++, index++ ); ++ ++ m_exitView->leftView()->insertItem( "reload", i18n( "&Restart Computer" ).replace("&",""), ++ i18n( "Restart and boot the default system" ), ++ "kicker:/restart", nId++, index++ ); ++ ++ insertSuspendOption(nId, index); ++ ++ int def, cur; ++ QStringList dummy_opts; ++ if ( DM().bootOptions( dummy_opts, def, cur ) ) ++ { ++ ++ KMenuItem *restart = m_exitView->leftView()->insertItem( "reload", i18n( "Start Operating System" ), ++ i18n( "Restart and boot another operating system" ), ++ "kicker:/restart/", nId++, index++ ); ++ restart->setHasChildren(true); ++ } ++ } ++} ++ ++void KMenu::insertStaticItems() ++{ ++ insertStaticExitItems(); ++ ++ int nId = serviceMenuEndId() + 10; ++ int index = 1; ++ ++ m_systemView->insertSeparator( nId++, i18n("Applications"), index++); ++ ++ KService::Ptr p = KService::serviceByStorageId("/usr/share/applications/YaST.desktop"); ++ m_systemView->insertMenuItem(p, nId++, index++); ++ ++ m_systemView->insertItem( "info", i18n( "System Information" ), ++ "sysinfo:/", "sysinfo:/", nId++, index++ ); ++ ++ m_systemView->insertSeparator( nId++, i18n("System Folders"), index++ ); ++ ++ m_systemView->insertItem( "folder_home", i18n( "Home Folder" ), ++ QDir::homeDirPath(), "file://"+QDir::homeDirPath(), nId++, index++ ); ++ ++ if ( KStandardDirs::exists( KGlobalSettings::documentPath() + "/" ) ) ++ { ++ QString documentPath = KGlobalSettings::documentPath(); ++ if ( documentPath.endsWith( "/" ) ) ++ documentPath = documentPath.left( documentPath.length() - 1 ); ++ if (documentPath!=QDir::homeDirPath()) ++ m_systemView->insertItem( "folder_man", i18n( "My Documents" ), documentPath, documentPath, nId++, index++ ); ++ } ++ ++ m_systemView->insertItem( "network", i18n( "Network Folders" ), ++ "remote:/", "remote:/", nId++, index++ ); ++ ++ m_mediaWatcher = new MediaWatcher( this ); ++ connect( m_mediaWatcher, SIGNAL( mediumChanged() ), SLOT( updateMedia() ) ); ++ m_media_id = 0; ++ ++ connect(&m_mediaFreeTimer, SIGNAL(timeout()), SLOT( updateMedia())); ++} ++ ++int KMenu::insertClientMenu(KickerClientMenu *) ++{ ++#if 0 ++ int id = client_id; ++ clients.insert(id, p); ++ return id; ++#endif ++ return 0; ++} ++ ++void KMenu::removeClientMenu(int) ++{ ++#if 0 ++ clients.remove(id); ++ slotClear(); ++#endif ++} ++ ++extern int kicker_screen_number; ++ ++void KMenu::slotLock() ++{ ++ kdDebug() << "slotLock " << endl; ++ accept(); ++ QCString appname( "kdesktop" ); ++ if ( kicker_screen_number ) ++ appname.sprintf("kdesktop-screen-%d", kicker_screen_number); ++ kapp->dcopClient()->send(appname, "KScreensaverIface", "lock()", ""); ++} ++ ++void KMenu::slotOpenHomepage() ++{ ++ accept(); ++ kapp->invokeBrowser("http://opensuse.org"); ++} ++ ++void KMenu::slotLogout() ++{ ++ kapp->requestShutDown(); ++} ++ ++void KMenu::slotPopulateSessions() ++{ ++ int p = 0; ++ DM dm; ++ ++ sessionsMenu->clear(); ++ if (kapp->authorize("start_new_session") && (p = dm.numReserve()) >= 0) ++ { ++ if (kapp->authorize("lock_screen")) ++ sessionsMenu->insertItem(/*SmallIconSet("lockfork"),*/ i18n("Lock Current && Start New Session"), 100 ); ++ sessionsMenu->insertItem(SmallIconSet("fork"), i18n("Start New Session"), 101 ); ++ if (!p) { ++ sessionsMenu->setItemEnabled( 100, false ); ++ sessionsMenu->setItemEnabled( 101, false ); ++ } ++ sessionsMenu->insertSeparator(); ++ } ++ SessList sess; ++ if (dm.localSessions( sess )) ++ for (SessList::ConstIterator it = sess.begin(); it != sess.end(); ++it) { ++ int id = sessionsMenu->insertItem( DM::sess2Str( *it ), (*it).vt ); ++ if (!(*it).vt) ++ sessionsMenu->setItemEnabled( id, false ); ++ if ((*it).self) ++ sessionsMenu->setItemChecked( id, true ); ++ } ++} ++ ++void KMenu::slotSessionActivated( int ent ) ++{ ++ if (ent == 100) ++ doNewSession( true ); ++ else if (ent == 101) ++ doNewSession( false ); ++ else if (!sessionsMenu->isItemChecked( ent )) ++ DM().lockSwitchVT( ent ); ++} ++ ++void KMenu::doNewSession( bool lock ) ++{ ++ int result = KMessageBox::warningContinueCancel( ++ kapp->desktop()->screen(kapp->desktop()->screenNumber(this)), ++ i18n("<p>You have chosen to open another desktop session.<br>" ++ "The current session will be hidden " ++ "and a new login screen will be displayed.<br>" ++ "An F-key is assigned to each session; " ++ "F%1 is usually assigned to the first session, " ++ "F%2 to the second session and so on. " ++ "You can switch between sessions by pressing " ++ "Ctrl, Alt and the appropriate F-key at the same time. " ++ "Additionally, the KDE Panel and Desktop menus have " ++ "actions for switching between sessions.</p>") ++ .arg(7).arg(8), ++ i18n("Warning - New Session"), ++ KGuiItem(i18n("&Start New Session"), "fork"), ++ ":confirmNewSession", ++ KMessageBox::PlainCaption | KMessageBox::Notify); ++ ++ if (result==KMessageBox::Cancel) ++ return; ++ ++ if (lock) ++ slotLock(); ++ ++ DM().startReserve(); ++} ++ ++void KMenu::searchAccept() ++{ ++ QString cmd = m_kcommand->currentText().stripWhiteSpace(); ++ ++ bool logout = (cmd == "logout"); ++ bool lock = (cmd == "lock"); ++ ++ addToHistory(); ++ ++ if ( !logout && !lock ) ++ { ++ // first try if we have any search action ++ if (m_searchResultsWidget->currentItem()) { ++ m_searchResultsWidget->slotItemClicked(m_searchResultsWidget->currentItem()); ++ return; ++ } ++ } ++ ++ accept(); ++ saveConfig(); ++ ++ if ( logout ) ++ { ++ kapp->propagateSessionManager(); ++ kapp->requestShutDown(); ++ } ++ if ( lock ) ++ { ++ QCString appname( "kdesktop" ); ++ int kicker_screen_number = qt_xscreen(); ++ if ( kicker_screen_number ) ++ appname.sprintf("kdesktop-screen-%d", kicker_screen_number); ++ kapp->dcopClient()->send(appname, "KScreensaverIface", "lock()", ""); ++ } ++} ++ ++bool KMenu::runCommand() ++{ ++ kdDebug() << "runCommand() " << m_kcommand->lineEdit()->text() << endl; ++ // Ignore empty commands... ++ if ( m_kcommand->lineEdit()->text().isEmpty() ) ++ return true; ++ ++ accept(); ++ ++ if (input_timer->isActive ()) ++ input_timer->stop (); ++ ++ // Make sure we have an updated data ++ parseLine( true ); ++ ++ bool block = m_kcommand->signalsBlocked(); ++ m_kcommand->blockSignals( true ); ++ m_kcommand->clearEdit(); ++ m_kcommand->setFocus(); ++ m_kcommand->reset(); ++ m_kcommand->blockSignals( block ); ++ ++ ++ QString cmd; ++ KURL uri = m_filterData->uri(); ++ if ( uri.isLocalFile() && !uri.hasRef() && uri.query().isEmpty() ) ++ cmd = uri.path(); ++ else ++ cmd = uri.url(); ++ ++ QString exec; ++ ++ switch( m_filterData->uriType() ) ++ { ++ case KURIFilterData::LOCAL_FILE: ++ case KURIFilterData::LOCAL_DIR: ++ case KURIFilterData::NET_PROTOCOL: ++ case KURIFilterData::HELP: ++ { ++ // No need for kfmclient, KRun does it all (David) ++ (void) new KRun( m_filterData->uri(), parentWidget()); ++ return false; ++ } ++ case KURIFilterData::EXECUTABLE: ++ { ++ if( !m_filterData->hasArgsAndOptions() ) ++ { ++ // Look for desktop file ++ KService::Ptr service = KService::serviceByDesktopName(cmd); ++ if (service && service->isValid() && service->type() == "Application") ++ { ++ notifyServiceStarted(service); ++ KRun::run(*service, KURL::List()); ++ return false; ++ } ++ } ++ } ++ // fall-through to shell case ++ case KURIFilterData::SHELL: ++ { ++ if (kapp->authorize("shell_access")) ++ { ++ exec = cmd; ++ ++ if( m_filterData->hasArgsAndOptions() ) ++ cmd += m_filterData->argsAndOptions(); ++ ++ break; ++ } ++ else ++ { ++ KMessageBox::sorry( this, i18n("<center><b>%1</b></center>\n" ++ "You do not have permission to execute " ++ "this command.") ++ .arg( QStyleSheet::convertFromPlainText(cmd) )); ++ return true; ++ } ++ } ++ case KURIFilterData::UNKNOWN: ++ case KURIFilterData::ERROR: ++ default: ++ { ++ // Look for desktop file ++ KService::Ptr service = KService::serviceByDesktopName(cmd); ++ if (service && service->isValid() && service->type() == "Application") ++ { ++ notifyServiceStarted(service); ++ KRun::run(*service, KURL::List(), this); ++ return false; ++ } ++ ++ service = KService::serviceByName(cmd); ++ if (service && service->isValid() && service->type() == "Application") ++ { ++ notifyServiceStarted(service); ++ KRun::run(*service, KURL::List(), this); ++ return false; ++ } ++ ++ KMessageBox::sorry( this, i18n("<center><b>%1</b></center>\n" ++ "Could not run the specified command.") ++ .arg( QStyleSheet::convertFromPlainText(cmd) )); ++ return true; ++ } ++ } ++ ++ if ( KRun::runCommand( cmd, exec, m_iconName ) ) ++ return false; ++ ++ KMessageBox::sorry( this, i18n("<center><b>%1</b></center>\n" ++ "The specified command does not exist.").arg(cmd) ); ++ return true; // Let the user try again... ++} ++ ++void KMenu::show() ++{ ++ m_isShowing = true; ++ emit aboutToShow(); ++ ++ initialize(); ++ ++ PanelPopupButton *kButton = MenuManager::the()->findKButtonFor( this ); ++ if (kButton) ++ { ++ QPoint center = kButton->center(); ++ QRect screen = QApplication::desktop()->screenGeometry( center ); ++ setOrientation((center.y()-screen.y()<screen.height()/2) ++ ? TopDown : BottomUp); ++ } ++ ++ m_browserDirty=true; ++ m_recentDirty=true; ++ ++ updateMedia(); ++ m_mediaFreeTimer.start(10 * 1000); // refresh all 10s ++ ++ m_stacker->raiseWidget(FavoriteTab); ++ m_kcommand->clear(); ++ current_query.clear(); ++ m_kcommand->setFocus(); ++ ++ // we need to reenable it ++ m_toolTipsEnabled = QToolTip::isGloballyEnabled(); ++ QToolTip::setGloballyEnabled(KickerSettings::showToolTips()); ++ ++ KMenuBase::show(); ++ m_isShowing = false; ++} ++ ++void KMenu::setOrientation(MenuOrientation orientation) ++{ ++ if (m_orientation == orientation) ++ return; ++ ++ m_orientation=orientation; ++ ++ m_resizeHandle->setCursor(m_orientation == BottomUp ? Qt::sizeBDiagCursor : Qt::sizeFDiagCursor); ++ ++ QPixmap pix; ++ if ( m_orientation == BottomUp ) ++ pix.load( locate("data", "kicker/pics/search-gradient.png" ) ); ++ else ++ pix.load( locate("data", "kicker/pics/search-gradient-topdown.png" ) ); ++ ++ pix.convertFromImage( pix.convertToImage().scale(pix.width(), m_searchFrame->height())); ++ m_search->mainWidget()->setPaletteBackgroundPixmap( pix ); ++ m_resizeHandle->setPaletteBackgroundPixmap( pix ); ++ ++ m_tabBar->setShape( m_orientation == BottomUp ++ ? QTabBar::RoundedBelow : QTabBar::RoundedAbove); ++ ++ QPixmap respix = QPixmap( locate("data", "kicker/pics/resize_handle.png" ) ); ++ if ( m_orientation == TopDown ) { ++ QWMatrix m; ++ m.rotate( 90.0 ); ++ respix=respix.xForm(m); ++ } ++ m_resizeHandle->setPixmap(respix); ++ ++ { ++ QWidget *footer = m_footer->mainWidget(); ++ QPixmap pix( 64, footer->height() ); ++ QPainter p( &pix ); ++ p.fillRect( 0, 0, 64, footer->height(), m_branding->colorGroup().brush( QColorGroup::Base ) ); ++ p.fillRect( 0, m_orientation == BottomUp ? footer->height() - 2 : 0, ++ 64, 3, KNewButton::self()->borderColor() ); ++ p.end(); ++ footer->setPaletteBackgroundPixmap( pix ); ++ } ++ ++ resizeEvent(new QResizeEvent(sizeHint(), sizeHint())); ++} ++ ++void KMenu::showMenu() ++{ ++ kdDebug() << "KMenu::showMenu()" << endl; ++ PanelPopupButton *kButton = MenuManager::the()->findKButtonFor(this); ++ if (kButton) ++ { ++ adjustSize(); ++ kButton->showMenu(); ++ } ++ else ++ { ++ show(); ++ } ++ kdDebug() << "end KMenu::showMenu()" << endl; ++} ++ ++void KMenu::hide() ++{ ++ //kdDebug() << "KMenu::hide() from " << kdBacktrace() << endl; ++ ++ // TODO: hide popups ++ ++ emit aboutToHide(); ++ ++ if (m_popupMenu) { ++ m_popupMenu->deleteLater(); ++ m_popupMenu=0; ++ } ++ m_mediaFreeTimer.stop(); ++ ++ m_isresizing = false; ++ ++ KickerSettings::setKMenuWidth(width()); ++ KickerSettings::setKMenuHeight(height()); ++ KickerSettings::writeConfig(); ++ ++ QToolTip::setGloballyEnabled(m_toolTipsEnabled); ++ ++ // remove focus from lineedit again, otherwise it doesn't kill its timers ++ m_stacker->raiseWidget(FavoriteTab); ++ ++ QWidget::hide(); ++} ++ ++void KMenu::paintEvent(QPaintEvent * e) ++{ ++ KMenuBase::paintEvent(e); ++ ++ QPainter p(this); ++ p.setClipRegion(e->region()); ++ ++ const BackgroundMode bgmode = backgroundMode(); ++ const QColorGroup::ColorRole crole = QPalette::backgroundRoleFromMode( bgmode ); ++ p.setBrush( colorGroup().brush( crole ) ); ++ ++ p.drawRect( 0, 0, width(), height() ); ++ int ypos = m_search->mainWidget()->geometry().bottom(); ++ ++ p.drawPixmap( 0, ypos, main_border_tl ); ++ p.drawPixmap( width() - main_border_tr.width(), ypos, main_border_tr ); ++ // p.drawPixmap( 0, ->y(), button_box_left ); ++} ++ ++ ++void KMenu::configChanged() ++{ ++ RecentlyLaunchedApps::the().m_bNeedToUpdate = false; ++ RecentlyLaunchedApps::the().configChanged(); ++ ++ m_exitView->leftView()->clear(); ++ insertStaticExitItems(); ++} ++ ++// create and fill "recent" section at first ++void KMenu::createRecentMenuItems() ++{ ++ RecentlyLaunchedApps::the().init(); ++ ++ if (!KickerSettings::numVisibleEntries()) ++ KickerSettings::setNumVisibleEntries(5); ++ ++ int nId = serviceMenuEndId() + 1; ++ m_recentlyView->insertSeparator( nId++, i18n( "Applications" ), -1 ); ++ ++ QStringList RecentApps; ++ ++ if (!KickerSettings::recentVsOften()) { ++ KickerSettings::setRecentVsOften(true); ++ RecentlyLaunchedApps::the().configChanged(); ++ RecentlyLaunchedApps::the().getRecentApps(RecentApps); ++ KickerSettings::setRecentVsOften(false); ++ RecentlyLaunchedApps::the().configChanged(); ++ } ++ else ++ RecentlyLaunchedApps::the().getRecentApps(RecentApps); ++ ++ ++ if (RecentApps.count() > 0) ++ { ++// bool bSeparator = KickerSettings::showMenuTitles(); ++ int nIndex = 0; ++ ++ for (QValueList<QString>::ConstIterator it = ++ RecentApps.begin(); it!=RecentApps.end(); ++it) ++ { ++ KService::Ptr s = KService::serviceByStorageId(*it); ++ if (!s) ++ { ++ RecentlyLaunchedApps::the().removeItem(*it); ++ } ++ else ++ m_recentlyView->insertMenuItem(s, nIndex++); ++ } ++ ++ } ++ ++ m_recentlyView->insertSeparator( nId++, i18n( "Documents" ), -1 ); ++ ++ QStringList fileList = KRecentDocument::recentDocuments(); ++ kdDebug() << "createRecentMenuItems=" << fileList << endl; ++ for (QStringList::ConstIterator it = fileList.begin(); ++ it != fileList.end(); ++ ++it) ++ m_recentlyView->insertRecentlyItem(*it, nId++); ++ ++} ++ ++void KMenu::clearSubmenus() ++{ ++ // we don't need to delete these on the way out since the libloader ++ // handles them for us ++ if (QApplication::closingDown()) ++ { ++ return; ++ } ++ ++ for (PopupMenuList::const_iterator it = dynamicSubMenus.constBegin(); ++ it != dynamicSubMenus.constEnd(); ++ ++it) ++ { ++ delete *it; ++ } ++ dynamicSubMenus.clear(); ++} ++ ++void KMenu::updateRecent() ++{ ++ m_recentlyView->clear(); ++ ++ createRecentMenuItems(); ++ ++ m_recentDirty = false; ++} ++ ++void KMenu::popup(const QPoint&, int) ++{ ++ showMenu(); ++} ++ ++void KMenu::clearRecentAppsItems() ++{ ++ RecentlyLaunchedApps::the().clearRecentApps(); ++ RecentlyLaunchedApps::the().save(); ++ RecentlyLaunchedApps::the().m_bNeedToUpdate = true; ++ updateRecent(); ++} ++ ++void KMenu::clearRecentDocsItems() ++{ ++ KRecentDocument::clear(); ++ updateRecent(); ++} ++ ++void KMenu::searchChanged(const QString & text) ++{ ++ if (!text.isEmpty()) { ++ const QColor on = QColor( 244, 244, 244 ); ++ const QColor off = QColor( 181, 181, 181 ); ++ m_stacker->raiseWidget(m_searchWidget); ++ paintSearchTab(true); ++ } ++ ++ m_searchActions->clearSelection(); ++ m_searchResultsWidget->clearSelection(); ++ ++ if (input_timer->isActive ()) ++ input_timer->stop (); ++ input_timer->start (WAIT_BEFORE_QUERYING, TRUE); ++} ++ ++bool KMenu::dontQueryNow (const QString& str) ++{ ++ if (str.isEmpty ()) ++ return true; ++ if (str == current_query.get()) ++ return true; ++ int length = str.length (); ++ int last_whitespace = str.findRev (' ', -1); ++ if (last_whitespace == length-1) ++ return false; // if the user typed a space, search ++ if (last_whitespace >= length-2) ++ return true; // dont search if the user only typed one character ++ QChar lastchar = str[length-1]; ++ if (lastchar == ":" || lastchar == "=") ++ return true; ++ return false; ++} ++ ++void KMenu::createNewProgramList() ++{ ++ m_seenProgramsChanged = false; ++ m_seenPrograms = KickerSettings::firstSeenApps(); ++ m_newInstalledPrograms.clear(); ++ ++ m_currentDate = QDate::currentDate().toString(Qt::ISODate); ++ ++ bool initialize = (m_seenPrograms.count() == 0); ++ ++ createNewProgramList(QString::null); ++ ++ if (initialize) { ++ for (QStringList::Iterator it = m_seenPrograms.begin(); it != m_seenPrograms.end(); ++it) ++ *(++it)="-"; ++ ++ m_newInstalledPrograms.clear(); ++ } ++ ++ if (m_seenProgramsChanged) { ++ KickerSettings::setFirstSeenApps(m_seenPrograms); ++ KickerSettings::writeConfig(); ++ } ++} ++ ++void KMenu::createNewProgramList(QString relPath) ++{ ++ KServiceGroup::Ptr group = KServiceGroup::group(relPath); ++ if (!group || !group->isValid()) ++ return; ++ ++ KServiceGroup::List list = group->entries(); ++ if (list.isEmpty()) ++ return; ++ ++ KServiceGroup::List::ConstIterator it = list.begin(); ++ for(; it != list.end(); ++it) { ++ KSycocaEntry *e = *it; ++ ++ if(e != 0) { ++ if(e->isType(KST_KServiceGroup)) { ++ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++ if(!g->noDisplay()) ++ createNewProgramList(g->relPath()); ++ } else if(e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(e)); ++ if(s->type() == "Application" && !s->noDisplay() ) { ++ QString shortStorageId = s->storageId().replace(".desktop",QString::null); ++ QStringList::Iterator it_find = m_seenPrograms.begin(); ++ QStringList::Iterator it_end = m_seenPrograms.end(); ++ bool found = false; ++ for (; it_find != it_end; ++it_find) { ++ if (*(it_find)==shortStorageId) { ++ found = true; ++ break; ++ } ++ ++it_find; ++ } ++ if (!found) { ++ m_seenProgramsChanged=true; ++ m_seenPrograms+=shortStorageId; ++ m_seenPrograms+=m_currentDate; ++ if (m_newInstalledPrograms.find(s->storageId())==m_newInstalledPrograms.end()) ++ m_newInstalledPrograms+=s->storageId(); ++ } ++ else { ++ ++it_find; ++ if (*(it_find)!="-") { ++ QDate date = QDate::fromString(*(it_find),Qt::ISODate); ++ if (date.daysTo(QDate::currentDate())<3) { ++ if (m_newInstalledPrograms.find(s->storageId())==m_newInstalledPrograms.end()) ++ m_newInstalledPrograms+=s->storageId(); ++ } ++ else { ++ m_seenProgramsChanged=true; ++ (*it_find)="-"; ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++} ++ ++void KMenu::searchProgramList(QString relPath) ++{ ++ KServiceGroup::Ptr group = KServiceGroup::group(relPath); ++ if (!group || !group->isValid()) ++ return; ++ ++ KServiceGroup::List list = group->entries(); ++ if (list.isEmpty()) ++ return; ++ ++ KServiceGroup::List::ConstIterator it = list.begin(); ++ for(; it != list.end(); ++it) { ++ KSycocaEntry *e = *it; ++ ++ if(e != 0) { ++ if(e->isType(KST_KServiceGroup)) { ++ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++ if(!g->noDisplay()) ++ searchProgramList(g->relPath()); ++ } else if(e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(e)); ++ if(s->type() == "Application" && !s->noDisplay() && !checkUriInMenu(s->desktopEntryPath())) { ++ if (!current_query.matches(s->name()+' '+s->genericName()+' '+s->exec()+' '+ ++ s->keywords().join(",")+' '+s->comment()+' '+group->caption()+' '+ ++ s->categories().join(",")) || !anotherHitMenuItemAllowed(APPS)) ++ continue; ++ ++ QString input = current_query.get(); ++ int score = 0; ++ if (s->exec()==input) ++ score = 100; ++ else if (s->exec().find(input)==0) ++ score = 50; ++ else if (s->exec().find(input)!=-1) ++ score = 10; ++ else if (s->name().lower()==input) ++ score = 100; ++ else if (s->genericName().lower()==input) ++ score = 100; ++ else if (s->name().lower().find(input)==0) ++ score = 50; ++ else if (s->genericName().lower().find(input)==0) ++ score = 50; ++ else if (s->name().lower().find(input)!=-1) ++ score = 10; ++ else if (s->genericName().lower().find(input)!=-1) ++ score = 10; ++ ++ if (s->exec().find(' ')==-1) ++ score+=1; ++ ++ if (s->substituteUid()) ++ score-=1; ++ ++ if (s->noDisplay()) ++ score -= 100; ++ else if (s->terminal()) ++ score -= 50; ++ else ++ score += kMin(10, s->initialPreference()); ++ ++ QString firstLine, secondLine; ++ if ((KickerSettings::DescriptionAndName || KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) && !s->genericName().isEmpty()) { ++ firstLine = s->genericName(); ++ secondLine = s->name(); ++ } ++ else { ++ firstLine = s->name(); ++ secondLine = s->genericName(); ++ } ++ ++ HitMenuItem *hit_item = new HitMenuItem (firstLine, secondLine, ++ s->desktopEntryPath(), QString::null, 0, APPS, s->icon(), score); ++ if (hit_item == NULL) ++ continue; ++ ++ hit_item->service = s; ++ insertSearchResult(hit_item); ++ ++ QString exe = s->exec(); ++ int pos = exe.find(' '); ++ if (pos>0) ++ exe=exe.left(pos); ++ m_programsInMenu+=KGlobal::dirs()->findExe(exe); ++ } ++ } ++ } ++ } ++} ++ ++void KMenu::searchBookmarks(KBookmarkGroup group) ++{ ++ KBookmark bookmark = group.first(); ++ while(!bookmark.isNull()) { ++ if (bookmark.isGroup()) { ++ searchBookmarks(bookmark.toGroup()); ++ } else if (!bookmark.isSeparator() && !bookmark.isNull()) { ++ if (!current_query.matches(bookmark.fullText()+' '+bookmark.url().url()) || !anotherHitMenuItemAllowed(BOOKMARKS)) { ++ bookmark = group.next(bookmark); ++ continue; ++ } ++ ++ HitMenuItem *hit_item = new HitMenuItem (bookmark.fullText(), bookmark.fullText(), ++ bookmark.url(), QString::null, 0, BOOKMARKS, bookmark.icon()); ++ ++ insertSearchResult(hit_item); ++ } ++ bookmark = group.next(bookmark); ++ } ++} ++ ++void KMenu::initSearch() ++{ ++ if (!m_addressBook && KickerSettings::kickoffSearchAddressBook()) ++ m_addressBook = KABC::StdAddressBook::self( false ); ++ ++ if (!bookmarkManager) ++ bookmarkManager = KBookmarkManager::userBookmarksManager(); ++ ++ if (!m_search_plugin) { ++ m_search_plugin_interface = new QObject( this, "m_search_plugin_interface" ); ++ new MyKickoffSearchInterface( this, m_search_plugin_interface, "kickoffsearch interface" ); ++ KTrader::OfferList offers = KTrader::self()->query("KickoffSearch/Plugin"); ++ ++ KService::Ptr service = *offers.begin(); ++ if (service) { ++ int errCode = 0; ++ m_search_plugin = KParts::ComponentFactory::createInstanceFromService<KickoffSearch::Plugin> ++ ( service, m_search_plugin_interface, 0, QStringList(), &errCode); ++ } ++ } ++} ++ ++void KMenu::searchAddressbook() ++{ ++ if (!KickerSettings::kickoffSearchAddressBook()) ++ return; ++ ++ if (!m_addressBook) ++ m_addressBook = KABC::StdAddressBook::self( false ); ++ ++ KABC::AddressBook::ConstIterator it = m_addressBook->begin(); ++ while (it!=m_addressBook->end()) { ++ if (!current_query.matches((*it).assembledName()+' '+(*it).fullEmail())) { ++ it++; ++ continue; ++ } ++ ++ HitMenuItem *hit_item; ++ QString realName = (*it).realName(); ++ if (realName.isEmpty()) ++ realName=(*it).preferredEmail(); ++ ++ if (!(*it).preferredEmail().isEmpty()) { ++ if (!anotherHitMenuItemAllowed(ACTIONS)) { ++ it++; ++ continue; ++ } ++ ++ hit_item = new HitMenuItem (i18n("Send Email to %1").arg(realName), (*it).preferredEmail(), ++ "mailto:"+(*it).preferredEmail(), QString::null, 0, ACTIONS, "mail_new"); ++ ++ insertSearchResult(hit_item); ++ } ++ ++ if (!anotherHitMenuItemAllowed(ACTIONS)) { ++ it++; ++ continue; ++ } ++ ++ hit_item = new HitMenuItem (i18n("Open Addressbook at %1").arg(realName), (*it).preferredEmail(), ++ "kaddressbook:/"+(*it).uid(), QString::null, 0, ACTIONS, "kaddressbook"); ++ ++ insertSearchResult(hit_item); ++ ++ it++; ++ } ++} ++ ++QString KMenu::insertBreaks(const QString& text, QFontMetrics fm, int width, QString leadInsert) ++{ ++ QString result, line; ++ QStringList words = QStringList::split(' ', text); ++ ++ for(QStringList::Iterator it = words.begin(); it != words.end(); ++it) { ++ if (fm.width(line+' '+*it) >= width) { ++ if (!result.isEmpty()) ++ result = result + '\n'; ++ result = result + line; ++ line = leadInsert + *it; ++ } ++ else ++ line = line + ' ' + *it; ++ } ++ if (!result.isEmpty()) ++ result = result + '\n'; ++ ++ return result + line; ++} ++ ++void KMenu::clearSearchResults(bool showHelp) ++{ ++ m_searchResultsWidget->clear(); ++ m_searchResultsWidget->setFocusPolicy(showHelp ? QWidget::NoFocus : QWidget::StrongFocus); ++ setTabOrder(m_kcommand, m_searchResultsWidget); ++ ++ if (showHelp) { ++ const int width = m_searchResultsWidget->width()-10; ++ QFontMetrics fm = m_searchResultsWidget->fontMetrics(); ++ ++ QListViewItem* item; ++ item = new QListViewItem( m_searchResultsWidget, insertBreaks(i18n("- Add ext:type to specify a file extension."), fm, width, " ") ); ++ item->setSelectable(false); ++ item->setMultiLinesEnabled(true); ++ item = new QListViewItem( m_searchResultsWidget, insertBreaks(i18n("- When searching for a phrase, add quotes."), fm, width, " " ) ); ++ item->setSelectable(false); ++ item->setMultiLinesEnabled(true); ++ item = new QListViewItem( m_searchResultsWidget, insertBreaks(i18n("- To exclude search terms, use the minus symbol in front."), fm, width, " " ) ); ++ item->setSelectable(false); ++ item->setMultiLinesEnabled(true); ++ item = new QListViewItem( m_searchResultsWidget, insertBreaks(i18n("- To search for optional terms, use OR."), fm, width, " ") ); ++ item->setSelectable(false); ++ item->setMultiLinesEnabled(true); ++ item = new QListViewItem( m_searchResultsWidget, insertBreaks(i18n("- You can use upper and lower case."), fm, width, " ") ); ++ item->setSelectable(false); ++ item->setMultiLinesEnabled(true); ++ item = new QListViewItem( m_searchResultsWidget, i18n("Search Quick Tips")); ++ item->setSelectable(false); ++ } ++ ++ for (int i=0; i<num_categories; ++i) { ++ categorised_hit_total [i] = 0; ++ max_category_id [i] = base_category_id [i]; ++ } ++} ++ ++void KMenu::doQuery (bool return_pressed) ++{ ++ QString query_str = m_kcommand->lineEdit()->text ().simplifyWhiteSpace (); ++ if (! return_pressed && dontQueryNow (query_str)) { ++ if (query_str.length()<3) ++ clearSearchResults(); ++ else { ++ if (m_searchResultsWidget->firstChild() && m_searchResultsWidget->firstChild()->isSelectable()) { ++ m_searchResultsWidget->setSelected(m_searchResultsWidget->firstChild(),true); ++ } ++ else if (m_searchResultsWidget->childCount()>1) { ++ m_searchResultsWidget->setSelected(m_searchResultsWidget->firstChild()->itemBelow(),true); ++ } ++ } ++ return; ++ } ++ kdDebug() << "Querying for [" << query_str << "]" << endl; ++ current_query.set(query_str); ++ ++ // reset search results ++ HitMenuItem *hit_item; ++ while ((hit_item = m_current_menu_items.take ()) != NULL) { ++ //kndDebug () << " (" << hit_item->id << "," << hit_item->category << ")" << endl; ++ delete hit_item; ++ } ++ ++ clearSearchResults(false); ++ m_searchPixmap->setMovie(QMovie(locate( "data", "kicker/pics/search-running.mng" ))); ++ ++ resetOverflowCategory(); ++ ++ initCategoryTitlesUpdate(); ++ ++ // calculate ? ++ QString cmd = query_str.stripWhiteSpace(); ++ if (!cmd.isEmpty() && (cmd[0].isNumber() || (cmd[0] == '(')) && ++ (QRegExp("[a-zA-Z\\]\\[]").search(cmd) == -1)) ++ { ++ QString result = calculate(cmd); ++ if (!result.isEmpty()) ++ { ++ categorised_hit_total[ACTIONS] ++; ++ HitMenuItem *hit_item = new HitMenuItem (i18n("%1 = %2").arg(query_str, result), QString::null, ++ "kcalc", QString::null, (++max_category_id [ACTIONS]), ACTIONS, "kcalc"); ++ int index = getHitMenuItemPosition (hit_item); ++ m_searchResultsWidget->insertItem(iconForHitMenuItem(hit_item), hit_item->display_name, ++ hit_item->display_info, KGlobal::dirs()->findExe("kcalc"), max_category_id [ACTIONS], index); ++ } ++ } ++ ++ // detect email address ++ if (emailRegExp.exactMatch(query_str)) { ++ categorised_hit_total[ACTIONS] ++; ++ HitMenuItem *hit_item = new HitMenuItem (i18n("Send Email to %1").arg(query_str), QString::null, ++ "mailto:"+query_str, QString::null, (++max_category_id [ACTIONS]), ACTIONS, "mail_new"); ++ int index = getHitMenuItemPosition (hit_item); ++ m_searchResultsWidget->insertItem(iconForHitMenuItem(hit_item), hit_item->display_name, hit_item->display_info, "mailto:"+query_str, max_category_id [ACTIONS], index); ++ } ++ ++ // quick own application search ++ m_programsInMenu.clear(); ++ searchProgramList(QString::null); ++ ++ KURIFilterData filterData; ++ filterData.setData(query_str); ++ filterData.setCheckForExecutables(true); ++ ++ if (KURIFilter::self()->filterURI(filterData)) { ++ ++ QString description; ++ QString exe; ++ ++ switch (filterData.uriType()) { ++ case KURIFilterData::LOCAL_FILE: ++ description = i18n("Open Local File: %1").arg(filterData.uri().url()); ++ break; ++ case KURIFilterData::LOCAL_DIR: ++ description = i18n("Open Local Dir: %1").arg(filterData.uri().url()); ++ break; ++ case KURIFilterData::NET_PROTOCOL: ++ description = i18n("Open Remote Location: %1").arg(filterData.uri().url()); ++ break; ++ case KURIFilterData::SHELL: ++ case KURIFilterData::EXECUTABLE: ++ { ++ exe = KGlobal::dirs()->findExe(filterData.uri().url()); ++#ifdef KDELIBS_SUSE ++ bool gimp_hack = false; ++ if (exe.endsWith("/bin/gimp")) { ++ QStringList::ConstIterator it = m_programsInMenu.begin(); ++ for (; it != m_programsInMenu.end(); ++it) ++ if ((*it).find("bin/gimp-remote-")!=-1) { ++ gimp_hack = true; ++ break; ++ } ++ } ++#endif ++ if (m_programsInMenu.find(exe)!=m_programsInMenu.end() ++#ifdef KDELIBS_SUSE ++ || gimp_hack ++#endif ++ ) ++ exe = QString::null; ++ else if (kapp->authorize("shell_access")) ++ { ++ if( filterData.hasArgsAndOptions() ) ++ exe += filterData.argsAndOptions(); ++ ++ description = i18n("Run '%1'").arg(exe); ++ exe = "kicker:/runcommand"; ++ } ++ } ++ default: ++ break; ++ } ++ ++ if (!description.isEmpty()) { ++ categorised_hit_total[ACTIONS] ++; ++ HitMenuItem *hit_item = new HitMenuItem (description, QString::null, ++ exe.isEmpty() ? filterData.uri() : exe, QString::null, ++ (++max_category_id [ACTIONS]), ACTIONS, exe.isEmpty() ? "fileopen": "run"); ++ int index = getHitMenuItemPosition (hit_item); ++ m_searchResultsWidget->insertItem(iconForHitMenuItem(hit_item), hit_item->display_name, ++ hit_item->display_info, ++ exe.isEmpty() ? filterData.uri().url() : exe, max_category_id [ACTIONS], index); ++ } ++ } ++ ++ // search Konqueror bookmarks; ++ if (!bookmarkManager) ++ bookmarkManager = KBookmarkManager::userBookmarksManager(); ++ ++ if (query_str.length()>=3) ++ searchBookmarks(bookmarkManager->root()); ++ ++ // search KDE addressbook ++ if (query_str.length()>=3) ++ searchAddressbook(); ++ ++ updateCategoryTitles(); ++ ++ if (m_searchResultsWidget->childCount()>1) ++ m_searchResultsWidget->setSelected(m_searchResultsWidget->firstChild()->itemBelow(),true); ++ m_searchActions->clearSelection(); ++ ++ if (!m_search_plugin) ++ initSearch(); ++ ++ // start search plugin only with at least 3 characters ++ if (query_str.length()<3 || !m_search_plugin || (m_search_plugin && !m_search_plugin->daemonRunning()) ) { ++ m_searchPixmap->setPixmap( BarIcon( "find", 32 ) ); ++ fillOverflowCategory(); ++ if (query_str.length()>2 && m_current_menu_items.isEmpty()) ++ reportError (i18n("No matches found")); ++ return; ++ } ++ ++ if (m_search_plugin) { ++ m_search_plugin->query(current_query.get(), KickerSettings::DescriptionAndName || KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly); ++ } ++} ++ ++bool KMenu::anotherHitMenuItemAllowed(int cat, bool count) ++{ ++ // update number of hits in this category ++ if (count) ++ categorised_hit_total [cat] ++; ++ ++ // if number of hits in this category is more than allowed, dont process this ++ if (max_category_id [cat] - base_category_id [cat] < max_items(cat)) ++ return true; ++ ++ if (m_overflowCategoryState==None || (m_overflowCategoryState==Filling && m_overflowCategory==cat && ++ max_category_id [cat] + m_overflowList.count() - base_category_id [cat] < max_items(cat) * 2.0)) ++ return true; ++ ++ return false; ++} ++ ++void KMenu::addHitMenuItem(HitMenuItem* item) ++{ ++ if (checkUriInMenu(item->uri)) ++ return; ++ ++ // if number of hits in this category is more than allowed, dont process this ++ if (!anotherHitMenuItemAllowed(item->category, false)) ++ return; ++ ++ insertSearchResult(item); ++} ++ ++void KMenu::insertSearchResult(HitMenuItem* item) ++{ ++ if (m_overflowCategoryState==None) { ++ m_overflowCategoryState = Filling; ++ m_overflowCategory = item->category; ++ } ++ else if (m_overflowCategoryState==Filling && m_overflowCategory!=item->category) ++ m_overflowCategoryState = NotNeeded; ++ ++ if (max_category_id [item->category] - base_category_id [item->category] < max_items(item->category)) { ++ max_category_id [item->category]++; ++ item->id=max_category_id [item->category]; ++ ++ int index = getHitMenuItemPosition (item); ++ ++ kdDebug () << "Adding " << item->uri ++ << "(" << item->mimetype << ") with id=" ++ << max_category_id [item->category] << " at " << index << endl; ++ ++ KMenuItem *hit_item = m_searchResultsWidget->insertItem(iconForHitMenuItem(item), item->display_name, item->display_info, item->uri.url(), max_category_id [item->category], index); ++ hit_item->setService(item->service); ++ ++ kdDebug () << "Done inserting ... " << endl; ++ } ++ else if (m_overflowCategoryState==Filling && m_overflowCategory==item->category && ++ max_category_id [item->category] - base_category_id [item->category] < max_items(item->category) * 2) ++ m_overflowList.append(item); ++} ++ ++void KMenu::searchOver() ++{ ++ m_searchPixmap->setPixmap( BarIcon( "find", 32 ) ); ++ fillOverflowCategory(); ++ if (m_current_menu_items.isEmpty()) { ++ kdDebug() << "No matches found" << endl; ++ reportError (i18n("No matches found")); ++ } ++ if (!m_searchResultsWidget->selectedItem() && !m_searchActions->selectedItem() && m_searchResultsWidget->childCount()>1) { ++ m_searchResultsWidget->setSelected(m_searchResultsWidget->firstChild()->itemBelow(),true); ++ } ++} ++ ++void KMenu::initCategoryTitlesUpdate() ++{ ++ // Need to know if each category was updated with hits or had the first hit ++ // That way we know if we need to changetitle or inserttitle ++ already_added = new bool [num_categories]; ++ for (int i=0; i<num_categories; ++i) ++ already_added [i] = (max_category_id [i] != base_category_id [i]); ++} ++ ++void KMenu::updateCategoryTitles() ++{ ++ // update category title ++ for (int i=0; i<num_categories; ++i) { ++ if (i == OTHER) ++ continue; ++ // nothing is in this category ++ if (max_category_id [i] == base_category_id [i]) ++ continue; ++ ++ KMenuItemSeparator *sep = 0; ++ ++ // if nothing was in this category before but now there is ++ if (! already_added [i]) { ++ // insert a new title for this category ++ int index = getHitMenuItemPosition (new HitMenuItem ( ++ base_category_id[i], ++ i)); ++ QString title = QString ("%1").arg (i18n(categories [i].utf8())); ++ sep = m_searchResultsWidget->insertSeparator(base_category_id [i], title, index); ++ kdDebug () << "Inserting heading with id=" << base_category_id[i] << " for " << categories[i] << " at " << index << endl; ++ } else { ++ // something was already displayed in this category ++ // update the title to reflect the total ++ sep = dynamic_cast<KMenuItemSeparator*>( m_searchResultsWidget->findItem(base_category_id [i]) ); ++ if ( !sep ) ++ continue; ++ kdDebug () << "Changing heading of id=" << base_category_id[i] << " for " << categories[i] << endl; ++ } ++ ++ int max = max_items(i); ++ if (m_overflowCategoryState == Filling && m_overflowCategory == i) ++ max *= 2; ++ ++ if ( categorised_hit_total [i] > max ) { ++ if (m_kerryInstalled) ++ sep->setLink( i18n( "top %1 of %2" ).arg( max ).arg( categorised_hit_total [i] ), QString( "kerry:/%1" ).arg( i ) ); ++ else ++ sep->setText( 0, i18n( "%1 (top %2 of %3)" ).arg( i18n(categories [i].utf8()) ).arg( max ).arg( categorised_hit_total [i] ) ); ++ } ++ else { ++ sep->setLink( QString::null ); ++ } ++ } ++ delete[] already_added; ++ already_added = 0; ++} ++ ++QString KMenu::iconForHitMenuItem(HitMenuItem *hit_item) ++{ ++ // get the icon ++ if (!hit_item->icon.isEmpty()) ++ return hit_item->icon; ++ ++ if (hit_item->category == WEBHIST) { ++ QString favicon = KMimeType::favIconForURL (hit_item->uri); ++ if (! favicon.isEmpty ()) ++ return favicon; ++ } ++ ++ if (mimetype_iconstore.contains (hit_item->mimetype)) ++ return (mimetype_iconstore [hit_item->mimetype]); ++ else { ++ KMimeType::Ptr mimetype_ptr = KMimeType::mimeType (hit_item->mimetype); ++ QString mimetype_icon = mimetype_ptr->icon(QString::null, FALSE); ++ mimetype_iconstore [hit_item->mimetype] = mimetype_icon; ++ return mimetype_icon; ++ } ++ return QString::null; ++} ++ ++void KMenu::slotStartService(KService::Ptr ptr) ++{ ++ accept(); ++ ++ addToHistory(); ++ KApplication::startServiceByDesktopPath(ptr->desktopEntryPath(), ++ QStringList(), 0, 0, 0, "", true); ++ updateRecentlyUsedApps(ptr); ++} ++ ++ ++void KMenu::slotStartURL(const QString& u) ++{ ++ if ( u == "kicker:/goup/" ) { ++ // only m_exitView is connected to this slot, not m_browserView ++ slotGoExitMainMenu(); ++ return; ++ } ++ ++ if ( u == "kicker:/restart/" || u=="kicker:/switchuser/") { ++ slotGoExitSubMenu(u); ++ return; ++ } ++ ++ accept(); ++ ++ if ( u == "kicker:/lock" ) { ++ slotLock(); ++ } ++ else if ( u == "kicker:/logout" ) { ++#ifdef KDELIBS_SUSE ++ QByteArray params; ++ QDataStream stream(params, IO_WriteOnly); ++ stream << 0 << -1 << ""; ++ ++ kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,QString)", params); ++#else ++ DCOPRef mediamanager("ksmserver", "ksmserver"); ++ DCOPReply reply = mediamanager.call( "logoutTimed", (int)KApplication::ShutdownTypeNone, (int)KApplication::ShutdownModeDefault ); ++ if (!reply.isValid() && KMessageBox::Continue==KMessageBox::warningContinueCancel(this, i18n("Do you really want to end the session?"), ++ i18n("Logout Confirmation"), KGuiItem(i18n("Logout"),"undo"))) ++ kapp->requestShutDown( KApplication::ShutdownConfirmNo, ++ KApplication::ShutdownTypeNone, ++ KApplication::ShutdownModeDefault ); ++ ++#endif ++ } ++ else if ( u == "kicker:/runcommand" ) ++ { ++ runCommand(); ++ } ++ else if ( u == "kicker:/shutdown" ) { ++#ifdef KDELIBS_SUSE ++ QByteArray params; ++ QDataStream stream(params, IO_WriteOnly); ++ stream << 2 << -1 << ""; ++ ++ kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,QString)", params); ++#else ++ if (KMessageBox::Continue==KMessageBox::warningContinueCancel(this, i18n("Do you really want to turn off the computer?"), ++ i18n("Shutdown Confirmation"), KGuiItem(i18n("Shutdown"),"exit"))) ++ kapp->requestShutDown( KApplication::ShutdownConfirmNo, ++ KApplication::ShutdownTypeHalt, ++ KApplication::ShutdownModeDefault ); ++#endif ++ } ++ else if ( u == "kicker:/restart" ) { ++#ifdef KDELIBS_SUSE ++ QByteArray params; ++ QDataStream stream(params, IO_WriteOnly); ++ stream << 1 << -1 << QString::null; ++ ++ kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,QString)", params); ++#else ++ if (KMessageBox::Continue==KMessageBox::warningContinueCancel(this, i18n("Do you really want to reset the computer and boot (another operating system)?"), ++ i18n("Restart Confirmation"), KGuiItem(i18n("Restart"),"reload"))) ++ kapp->requestShutDown( KApplication::ShutdownConfirmNo, ++ KApplication::ShutdownTypeReboot, ++ KApplication::ShutdownModeDefault ); ++#endif ++ } ++#ifdef KDELIBS_SUSE ++ else if ( u == "kicker:/suspend_disk" ) { ++ slotSuspend( 1 ); ++ } ++ else if ( u == "kicker:/suspend_ram" ) { ++ slotSuspend( 2 ); ++ } ++ else if ( u == "kicker:/standby" ) { ++ slotSuspend( 3 ); ++ } ++#endif ++ else if ( u == "kicker:/savesession" ) { ++ QByteArray data; ++ kapp->dcopClient()->send( "ksmserver", "default", ++ "saveCurrentSession()", data ); ++ } ++ else if ( u == "kicker:/switchuser" ) { ++ DM().startReserve(); ++ } ++ else if ( u == "kicker:/switchuserafterlock" ) { ++ slotLock(); ++ DM().startReserve(); ++ } ++ else if ( u.startsWith("kicker:/switchuser_") ) ++ DM().lockSwitchVT( u.mid(19).toInt() ); ++ else if ( u.startsWith("kicker:/restart_") ) { ++#ifdef KDELIBS_SUSE ++ QStringList rebootOptions; ++ int def, cur; ++ DM().bootOptions( rebootOptions, def, cur ); ++ ++ QByteArray params; ++ QDataStream stream(params, IO_WriteOnly); ++ stream << 1 << -1 << rebootOptions[u.mid(16).toInt()]; ++ ++ kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,QString)", params); ++#else ++ KMessageBox::error( this, QString( "Sorry, not implemented." )); ++#endif ++ } ++#warning restart entry not supported ++#if 0 ++ else if ( u == "kicker:/restart_windows" ) { ++ if (KMessageBox::Continue==KMessageBox::warningContinueCancel(this, i18n("Do you really want to reset the computer and boot Microsoft Windows"), i18n("Start Windows Confirmation"), KGuiItem(i18n("Start Windows"),"reload"))) ++ KMessageBox::error( this, QString( "kicker:/restart_windows is not yet implemented " ) ); ++ } ++#endif ++ else if ( u.startsWith("kerry:/")) ++ { ++ QByteArray data; ++ QDataStream arg(data, IO_WriteOnly); ++ arg << m_kcommand->currentText() << kerry_categories[u.mid(7).toInt()]; ++ if (ensureServiceRunning("kerry")) ++ kapp->dcopClient()->send("kerry","search","search(QString,QString)", data); ++ } ++ else { ++ addToHistory(); ++ if (u.startsWith("kaddressbook:/")) { ++ KProcess *proc = new KProcess; ++ *proc << "kaddressbook" << "--uid" << u.mid(14); ++ proc->start(); ++ accept(); ++ return; ++ } else if (u.startsWith("note:/")) { ++ KProcess *proc = new KProcess; ++ *proc << "tomboy"; ++ *proc << "--open-note" << u; ++ if (!proc->start()) ++ KMessageBox::error(0,i18n("Could not start Tomboy.")); ++ return; ++ } ++ else if (u.startsWith("knotes:/") ) { ++ if (ensureServiceRunning("knotes")) { ++ QByteArray data; ++ QDataStream arg(data, IO_WriteOnly); ++ arg << u.mid(9,22); ++ ++ kapp->dcopClient()->send("knotes","KNotesIface","showNote(QString)", data); ++ } ++ return; ++ } ++ ++ kapp->propagateSessionManager(); ++ (void) new KRun( u, parentWidget()); ++ } ++} ++ ++void KMenu::slotContextMenuRequested( QListViewItem * item, const QPoint & pos, int /*col*/ ) ++{ ++ const QObject* source = sender(); ++ ++ if (!item) ++ return; ++ ++ KMenuItem* kitem = dynamic_cast<KMenuItem*>(item); ++ if (!kitem) ++ return; ++ ++ KFileItemList _items; ++ _items.setAutoDelete(true); ++ ++ if (dynamic_cast<KMenuItemSeparator*>(item)) ++ return; ++ ++ m_popupService = kitem->service(); ++ m_popupPath.menuPath = kitem->menuPath(); ++ if (!m_popupService) { ++ m_popupPath.title = kitem->title(); ++ m_popupPath.description = kitem->description(); ++ m_popupPath.path = kitem->path(); ++ m_popupPath.icon = kitem->icon(); ++ ++ if (m_popupPath.path.startsWith(locateLocal("data", QString::fromLatin1("RecentDocuments/")))) { ++ KDesktopFile df(m_popupPath.path,true); ++ m_popupPath.path=df.readURL(); ++ } ++ } ++ ++ m_popupMenu = new KPopupMenu(this); ++ connect(m_popupMenu, SIGNAL(activated(int)), SLOT(slotContextMenu(int))); ++ bool hasEntries = false; ++ ++ m_popupMenu->insertTitle(SmallIcon(kitem->icon()),kitem->title()); ++ ++ if (source==m_favoriteView) ++ { ++ hasEntries = true; ++ m_popupMenu->insertItem(SmallIconSet("remove"), ++ i18n("Remove From Favorites"), RemoveFromFavorites); ++ } ++ else if (!kitem->hasChildren() && !m_popupPath.path.startsWith("system:/") && ++ !m_popupPath.path.startsWith("kicker:/switchuser_") && !m_popupPath.path.startsWith("kicker:/restart_")) ++ { ++ hasEntries = true; ++ int num = m_popupMenu->insertItem(SmallIconSet("bookmark_add"), ++ i18n("Add to Favorites"), AddToFavorites); ++ ++ QStringList favs = KickerSettings::favorites(); ++ if (m_popupService && favs.find(m_popupService->storageId())!=favs.end()) ++ m_popupMenu->setItemEnabled(num, false); ++ else { ++ QStringList::Iterator it; ++ for (it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/') ++ { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==m_popupPath.path) ++ break; ++ } ++ } ++ if (it!=favs.end()) ++ m_popupMenu->setItemEnabled(num, false); ++ } ++ } ++ ++ if (source!=m_exitView) { ++ if (m_popupService || (!m_popupPath.path.startsWith("kicker:/") && !m_popupPath.path.startsWith("system:/") && !m_popupPath.path.startsWith("kaddressbook:/"))) { ++ if (hasEntries) ++ m_popupMenu->insertSeparator(); ++ ++ if (kapp->authorize("editable_desktop_icons") ) ++ { ++ hasEntries = true; ++ if (m_popupPath.menuPath.endsWith("/")) ++ m_popupMenu->insertItem(SmallIconSet("desktop"), ++ i18n("Add Menu to Desktop"), AddMenuToDesktop); ++ else ++ m_popupMenu->insertItem(SmallIconSet("desktop"), ++ i18n("Add Item to Desktop"), AddItemToDesktop); ++ } ++ if (kapp->authorizeKAction("kicker_rmb") && !Kicker::the()->isImmutable()) ++ { ++ hasEntries = true; ++ if (m_popupPath.menuPath.endsWith("/")) ++ m_popupMenu->insertItem(SmallIconSet("kicker"), ++ i18n("Add Menu to Main Panel"), AddMenuToPanel); ++ else ++ m_popupMenu->insertItem(SmallIconSet("kicker"), ++ i18n("Add Item to Main Panel"), AddItemToPanel); ++ } ++ if (kapp->authorizeKAction("menuedit") && !kitem->menuPath().isEmpty()) ++ { ++ hasEntries = true; ++ if (kitem->menuPath().endsWith("/")) ++ m_popupMenu->insertItem(SmallIconSet("kmenuedit"), i18n("Edit Menu"), EditMenu); ++ else ++ m_popupMenu->insertItem(SmallIconSet("kmenuedit"), i18n("Edit Item"), EditItem); ++ } ++ if (kapp->authorize("run_command") && (m_popupService || (!m_popupPath.menuPath.isEmpty() && !m_popupPath.menuPath.endsWith("/")))) ++ { ++ hasEntries = true; ++ m_popupMenu->insertItem(SmallIconSet("run"), ++ i18n("Put Into Run Dialog"), PutIntoRunDialog); ++ } ++ } ++ if (source==m_searchResultsWidget || ((source==m_favoriteView || source==m_recentlyView || source == m_systemView) && !m_popupService && !m_popupPath.path.startsWith("kicker:/")) ) { ++ QString uri; ++ if (m_popupService) ++ uri = locate("apps", m_popupService->desktopEntryPath()); ++ else ++ uri = m_popupPath.path; ++ ++ QString mimetype = QString::null; ++ if ( m_popupPath.path.startsWith( "system:/media/" ) ) ++ mimetype = media_mimetypes[m_popupPath.path]; ++ ++ KFileItem* item = new KFileItem(uri, mimetype, KFileItem::Unknown); ++ _items.append( item ); ++ ++ const KURL kurl(uri); ++ KActionCollection act(this); ++ ++ KonqPopupMenu * konqPopupMenu = new KonqPopupMenu( KonqBookmarkManager::self(), _items, ++ kurl, act, (KNewMenu*)NULL, this, ++ item->isLocalFile() ? KonqPopupMenu::ShowProperties : KonqPopupMenu::NoFlags, ++ KParts::BrowserExtension::DefaultPopupItems ); ++ ++ if (konqPopupMenu->count()) { ++ if (hasEntries) { ++ m_popupMenu->insertSeparator(); ++ m_popupMenu->insertItem(SmallIconSet("add"),i18n("Advanced"), konqPopupMenu); ++ } ++ else { ++ delete m_popupMenu; ++ m_popupMenu = (KPopupMenu*)konqPopupMenu; ++ m_popupMenu->insertTitle(SmallIcon(kitem->icon()),kitem->title(),-1,0); ++ } ++ hasEntries = true; ++ } ++ } ++ } ++ ++ if (source==m_recentlyView) { ++ m_popupMenu->insertSeparator(); ++ if (m_popupService) ++ m_popupMenu->insertItem(SmallIconSet("history_clear"), ++ i18n("Clear Recently Used Applications"), ClearRecentlyUsedApps); ++ else ++ m_popupMenu->insertItem(SmallIconSet("history_clear"), ++ i18n("Clear Recently Used Documents"), ClearRecentlyUsedDocs); ++ } ++ ++ if (hasEntries) { ++ m_isShowing = true; ++ m_popupMenu->exec(pos); ++ m_isShowing = false; ++ } ++ ++ delete m_popupMenu; ++ m_popupMenu = 0; ++} ++ ++void KMenu::slotContextMenu(int selected) ++{ ++ KServiceGroup::Ptr g; ++ QByteArray ba; ++ QDataStream ds(ba, IO_WriteOnly); ++ ++ KURL src,dest; ++ KIO::CopyJob *job; ++ ++ KProcess *proc; ++ ++ QStringList favs = KickerSettings::favorites(); ++ ++ switch (selected) { ++ case AddItemToDesktop: ++ accept(); ++ if (m_popupService) { ++ src.setPath( KGlobal::dirs()->findResource( "apps", m_popupService->desktopEntryPath() ) ); ++ dest.setPath( KGlobalSettings::desktopPath() ); ++ dest.setFileName( src.fileName() ); ++ ++ job = KIO::copyAs( src, dest ); ++ job->setDefaultPermissions( true ); ++ } ++ else { ++ KDesktopFile* df = new KDesktopFile( newDesktopFile(KURL(m_popupPath.path), KGlobalSettings::desktopPath() ) ); ++ df->writeEntry("GenericName", m_popupPath.description); ++ df->writeEntry( "Icon", m_popupPath.icon ); ++ df->writePathEntry( "URL", m_popupPath.path ); ++ df->writeEntry( "Name", m_popupPath.title ); ++ df->writeEntry( "Type", "Link" ); ++ df->sync(); ++ delete df; ++ } ++ accept(); ++ break; ++ ++ case AddItemToPanel: ++ accept(); ++ if (m_popupService) ++ kapp->dcopClient()->send("kicker", "Panel", "addServiceButton(QString)", m_popupService->desktopEntryPath()); ++ else ++#warning FIXME special RecentDocuments/foo.desktop handling ++ kapp->dcopClient()->send("kicker", "Panel", "addURLButton(QString)", m_popupPath.path); ++ accept(); ++ break; ++ ++ case EditItem: ++ case EditMenu: ++ accept(); ++ proc = new KProcess(this); ++ *proc << KStandardDirs::findExe(QString::fromLatin1("kmenuedit")); ++ *proc << "/"+m_popupPath.menuPath.section('/',-200,-2) << m_popupPath.menuPath.section('/', -1); ++ proc->start(); ++ break; ++ ++ case PutIntoRunDialog: ++ accept(); ++ if (m_popupService) ++ kapp->dcopClient()->send("kdesktop", "default", "popupExecuteCommand(QString)", m_popupService->exec()); ++ else ++#warning FIXME special RecentDocuments/foo.desktop handling ++ kapp->dcopClient()->send("kdesktop", "default", "popupExecuteCommand(QString)", m_popupPath.path); ++ accept(); ++ break; ++ ++ case AddMenuToDesktop: { ++ accept(); ++ KDesktopFile *df = new KDesktopFile( newDesktopFile(KURL("programs:/"+m_popupPath.menuPath),KGlobalSettings::desktopPath())); ++ df->writeEntry( "Icon", m_popupPath.icon ); ++ df->writePathEntry( "URL", "programs:/"+m_popupPath.menuPath ); ++ df->writeEntry( "Name", m_popupPath.title ); ++ df->writeEntry( "Type", "Link" ); ++ df->sync(); ++ delete df; ++ ++ break; ++ } ++ case AddMenuToPanel: ++ accept(); ++ ds << "foo" << m_popupPath.menuPath; ++ kapp->dcopClient()->send("kicker", "Panel", "addServiceMenuButton(QString,QString)", ba); ++ break; ++ ++ case AddToFavorites: ++ if (m_popupService) { ++ if (favs.find(m_popupService->storageId())==favs.end()) { ++ KService::Ptr p = KService::serviceByStorageId(m_popupService->storageId()); ++ m_favoriteView->insertMenuItem(p, serviceMenuEndId()+favs.count()+1); ++ favs+=m_popupService->storageId(); ++ } ++ } ++ else { ++ QStringList::Iterator it; ++ for (it = favs.begin(); it != favs.end(); ++it) { ++ if ((*it)[0]=='/') { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==m_popupPath.path) ++ break; ++ } ++ } ++ if (it==favs.end()) { ++ QString file = KickerLib::newDesktopFile(m_popupPath.path); ++ KDesktopFile df(file); ++ df.writeEntry("Encoding", "UTF-8"); ++ df.writeEntry("Type","Link"); ++ df.writeEntry("Name", m_popupPath.title); ++ df.writeEntry("GenericName", m_popupPath.description); ++ df.writeEntry("Icon", m_popupPath.icon); ++ df.writeEntry("URL", m_popupPath.path); ++ ++ m_favoriteView->insertItem(m_popupPath.icon, m_popupPath.title, m_popupPath.description, ++ m_popupPath.path, serviceMenuEndId()+favs.count()+1, -1); ++ ++ favs+=file; ++ } ++ } ++ KickerSettings::setFavorites(favs); ++ KickerSettings::writeConfig(); ++ m_browserDirty=true; ++ m_stacker->raiseWidget(FavoriteTab); ++ break; ++ ++ case RemoveFromFavorites: ++ if (m_popupService) { ++ favs.erase(favs.find(m_popupService->storageId())); ++ ++ for (QListViewItemIterator it(m_favoriteView); it.current(); ++it) { ++ KMenuItem* kitem = static_cast<KMenuItem*>(it.current()); ++ if (kitem->service() && kitem->service()->storageId() == m_popupService->storageId()) { ++ delete it.current(); ++ break; ++ } ++ } ++ } ++ else { ++ for (QStringList::Iterator it = favs.begin(); it != favs.end(); ++it) { ++ if ((*it)[0]=='/') { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==m_popupPath.path) { ++ QFile::remove((*it)); ++ favs.erase(it); ++ break; ++ } ++ } ++ } ++ for (QListViewItemIterator it(m_favoriteView); it.current(); ++it) { ++ KMenuItem* kitem = static_cast<KMenuItem*>(it.current()); ++ if (!kitem->service() && kitem->path() == m_popupPath.path) { ++ delete it.current(); ++ break; ++ } ++ } ++ } ++ m_favoriteView->slotMoveContent(); ++ KickerSettings::setFavorites(favs); ++ KickerSettings::writeConfig(); ++ m_browserDirty=true; ++ m_stacker->raiseWidget(FavoriteTab); ++ break; ++ ++ case ClearRecentlyUsedApps: ++ clearRecentAppsItems(); ++ break; ++ ++ case ClearRecentlyUsedDocs: ++ clearRecentDocsItems(); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++void KMenu::resizeEvent ( QResizeEvent * e ) ++{ ++ //kdDebug() << "resizeEvent " << size() << endl; ++ KMenuBase::resizeEvent(e); ++ int ypos = 0; ++ // this is the height remaining to fill ++ int left_height = height(); ++ ++ if ( m_orientation == BottomUp ) ++ { ++ m_resizeHandle->move( e->size().width() - 19, 3); ++ ++ // put the search widget at the top of the menu and give it its desired ++ // height ++ m_search->mainWidget()->setGeometry( 0, ypos, width(), ++ m_search->minimumSize().height() ); ++ left_height -= m_search->minimumSize().height(); ++ ypos += m_search->minimumSize().height(); ++ ++ // place the footer widget at the bottom of the menu and give it its desired ++ // height ++ m_footer->mainWidget()->setGeometry( 0, height() - m_footer->minimumSize().height(), ++ width(), m_footer->minimumSize().height() ); ++ left_height -= m_footer->minimumSize().height(); ++ ++ // place the button box above the footer widget, horizontal placement ++ // has the width of the edge graphics subtracted ++ m_tabBar->setGeometry(button_box_left.width(), ++ height() - m_footer->minimumSize().height() - ++ m_tabBar->sizeHint().height(), ++ width() - button_box_left.width(), ++ m_tabBar->sizeHint().height() ); ++ left_height -= m_tabBar->sizeHint().height(); ++ ++ // place the main (stacker) widget below the search widget, ++ // in the remaining vertical space ++ m_stacker->setGeometry(0, ypos, ++ width(), ++ left_height ); ++ ++ } ++ else // TopDown orientation ++ { ++ // place the 'footer' widget at the top of the menu and give it ++ // its desired height ++ m_footer->mainWidget()->setGeometry( 0, ++ ypos /*height() - m_footer->minimumSize().height()*/, ++ width(), ++ m_footer->minimumSize().height() ); ++ ypos += m_footer->minimumSize().height(); ++ left_height -= m_footer->minimumSize().height(); ++ ++ // place the button box next at the top of the menu. ++ // has the width of the edge graphics subtracted ++ m_tabBar->setGeometry(button_box_left.width(), ypos, width() - button_box_left.width(), ++ m_tabBar->sizeHint().height()); ++ ++ ypos += m_tabBar->sizeHint().height(); ++ left_height -= m_tabBar->sizeHint().height(); ++ ++ // put the search widget above the footer widget ++ // height ++ m_search->mainWidget()->setGeometry( 0, ++ height() - m_search->minimumSize().height(), ++ width(), ++ m_search->minimumSize().height() ++ ); ++ left_height -= m_search->minimumSize().height(); ++ ++ // place the main (stacker) widget below the button box, ++ // in the remaining vertical space ++ m_stacker->setGeometry(0, ypos, ++ width(), ++ left_height ); ++ m_resizeHandle->move( e->size().width() - 19, e->size().height() - 19); ++ } ++ paintSearchTab( false ); ++} ++ ++void KMenu::mousePressEvent ( QMouseEvent * e ) ++{ ++ if ( m_orientation == BottomUp ) { ++ if (e->x() > width() - m_resizeHandle->width() && ++ e->y() < m_resizeHandle->height() ) ++ { ++ m_isresizing = true; ++ } ++ } ++ else { ++ if (e->x() > width() - m_resizeHandle->width() && ++ e->y() > height() - m_resizeHandle->height() ) ++ { ++ m_isresizing = true; ++ } ++ } ++ KMenuBase::mousePressEvent(e); ++} ++ ++void KMenu::mouseReleaseEvent ( QMouseEvent * /*e*/ ) ++{ ++ m_isresizing = false; ++} ++ ++void KMenu::mouseMoveEvent ( QMouseEvent * e ) ++{ ++ if ( hasMouseTracking() && m_isresizing ) { ++ m_stacker->setMinimumSize( QSize(0, 0) ); ++ m_stacker->setMaximumSize( QSize(32000, 32000) ); ++ int newWidth = QMAX( e->x() - x(), minimumSizeHint().width() ); ++ if ( m_orientation == BottomUp ) { ++ int newHeight = QMAX( height() - e->y(), minimumSizeHint().height() + 10 ); ++ int newY = y() + height() - newHeight; ++ setGeometry( x(), newY, newWidth, newHeight); ++ } ++ else { ++ setGeometry( x(), y(), newWidth, QMAX( e->y(), minimumSizeHint().height() + 10 )); ++ } ++ } ++} ++ ++void KMenu::clearedHistory() ++{ ++ saveConfig(); ++} ++ ++void KMenu::saveConfig() ++{ ++ KickerSettings::setHistory( m_kcommand->historyItems() ); ++ KickerSettings::setCompletionItems( m_kcommand->completionObject()->items() ); ++ KickerSettings::writeConfig(); ++} ++ ++void KMenu::notifyServiceStarted(KService::Ptr service) ++{ ++ // Inform other applications (like the quickstarter applet) ++ // that an application was started ++ QByteArray params; ++ QDataStream stream(params, IO_WriteOnly); ++ stream << "minicli" << service->storageId(); ++ kdDebug() << "minicli appLauncher dcop signal: " << service->storageId() << endl; ++ KApplication::kApplication()->dcopClient()->emitDCOPSignal("appLauncher", ++ "serviceStartedByStorageId(QString,QString)", params); ++} ++ ++void KMenu::parseLine( bool final ) ++{ ++ QString cmd = m_kcommand->currentText().stripWhiteSpace(); ++ m_filterData->setData( cmd ); ++ ++ if( final ) ++ KURIFilter::self()->filterURI( *(m_filterData), m_finalFilters ); ++ else ++ KURIFilter::self()->filterURI( *(m_filterData), m_middleFilters ); ++ ++ m_iconName = m_filterData->iconName(); ++ ++ kdDebug (1207) << "Command: " << m_filterData->uri().url() << endl; ++ kdDebug (1207) << "Arguments: " << m_filterData->argsAndOptions() << endl; ++} ++ ++// report error as a title in the menu ++void KMenu::reportError (QString error) ++{ ++ int index = 1000; //getHitMenuItemPosition (new HitMenuItem (base_category_id[0], 0)); ++ kndDebug () << "Inserting error:" << error << " at position " << index << endl; ++ m_searchResultsWidget->insertSeparator(OTHER_ID_BASE + 120, error, index); ++} ++ ++int KMenu::getHitMenuItemPosition ( HitMenuItem *hit_item) ++{ ++ QPtrListIterator<HitMenuItem> it (m_current_menu_items); ++ const HitMenuItem *cur_item; ++ int pos = 0; ++ while ((cur_item = it.current ()) != NULL) { ++ ++it; ++ if ((cur_item->category!=hit_item->category || !cur_item->display_name.isEmpty()) && (*hit_item) < (*cur_item)) ++ break; ++ pos++; ++ } ++ m_current_menu_items.insert (pos, hit_item); ++ ++ return pos + 1; ++} ++ ++bool KMenu::checkUriInMenu( const KURL &uri) ++{ ++ QPtrListIterator<HitMenuItem> it (m_current_menu_items); ++ const HitMenuItem *cur_item; ++ while ((cur_item = it.current ()) != NULL) { ++ ++it; ++ if (cur_item->uri == uri ) ++ return true; ++ } ++ ++ return false; ++} ++ ++void KMenu::searchActionClicked(QListViewItem* item) ++{ ++ accept(); ++ ++ addToHistory(); ++ if (item==m_searchIndex) { ++ QByteArray data; ++ QDataStream arg(data, IO_WriteOnly); ++ arg << m_kcommand->currentText(); ++ ++ if (ensureServiceRunning("kerry")) ++ kapp->dcopClient()->send("kerry","search","search(QString)", data); ++ } ++ else { ++ KURIFilterData data; ++ QStringList list; ++ data.setData( m_kcommand->currentText() ); ++ list << "kurisearchfilter" << "kuriikwsfilter"; ++ ++ if( !KURIFilter::self()->filterURI(data, list) ) { ++ KDesktopFile file("searchproviders/google.desktop", true, "services"); ++ data.setData(file.readEntry("Query").replace("\\{@}", m_kcommand->currentText())); ++ } ++ ++ (void) new KRun( data.uri(), parentWidget()); ++ } ++} ++ ++void KMenu::addToHistory() ++{ ++ QString search = m_kcommand->currentText().stripWhiteSpace(); ++ ++ if (search.length()<4) ++ return; ++ ++ m_kcommand->addToHistory( search ); ++} ++ ++QString KMenu::newDesktopFile(const KURL& url, const QString &directory) ++{ ++ QString base = url.fileName(); ++ if (base.endsWith(".desktop")) ++ base.truncate(base.length()-8); ++ QRegExp r("(.*)(?=-\\d+)"); ++ if (r.search(base) > -1) ++ base = r.cap(1); ++ ++ QString file = base + ".desktop"; ++ ++ for(int n = 1; ++n; ) ++ { ++ if (!QFile::exists(directory+file)) ++ break; ++ ++ file = QString("%2-%1.desktop").arg(n).arg(base); ++ } ++ return directory+file; ++} ++ ++void KMenu::updateRecentlyUsedApps(KService::Ptr &service) ++{ ++ QString strItem(service->desktopEntryPath()); ++ ++ // don't add an item from root kmenu level ++ if (!strItem.contains('/')) ++ { ++ return; ++ } ++ ++ // add it into recent apps list ++ RecentlyLaunchedApps::the().appLaunched(strItem); ++ RecentlyLaunchedApps::the().save(); ++ RecentlyLaunchedApps::the().m_bNeedToUpdate = true; ++} ++ ++QSize KMenu::sizeHint() const ++{ ++#warning FIXME ++ // this should be only for the inner area so layout changes do not break it ++ const int width = kMin(KickerSettings::kMenuWidth(), QApplication::desktop()->screen()->width()-50); ++ ++ const int height = kMin(KickerSettings::kMenuHeight(), QApplication::desktop()->screen()->height()-50); ++ QSize wanted(width, height); ++ kdDebug() << "show " << minimumSizeHint() << " " << m_stacker->minimumSizeHint() << " " ++ << m_searchFrame->minimumSizeHint() << " " << wanted << endl; ++ bool isDefault = wanted.isNull(); ++ wanted = wanted.expandedTo(minimumSizeHint()); ++ if ( isDefault ) ++ wanted.setHeight( wanted.height() + ( m_favoriteView->goodHeight() - m_stacker->minimumSizeHint().height() ) ); ++ ++ return wanted; ++} ++ ++QSize KMenu::minimumSizeHint() const ++{ ++ QSize minsize; ++ minsize.setWidth( minsize.width() + m_tabBar->sizeHint().width() ); ++ minsize.setWidth( QMAX( minsize.width(), ++ m_search->minimumSize().width() ) ); ++ minsize.setWidth( QMAX( minsize.width(), ++ m_search->minimumSize().width() ) ); ++ ++ minsize.setHeight( minsize.height() + ++ m_search->minimumSize().height() + ++ m_footer->minimumSize().height() + ++ 180 ); // 180 is a very rough guess for 32 icon size ++ return minsize; ++} ++ ++void KMenu::slotFavoritesMoved( QListViewItem* item, QListViewItem* /*afterFirst*/, QListViewItem* afterNow) ++{ ++ KMenuItem* kitem = dynamic_cast<KMenuItem*>(item); ++ KMenuItem* kafterNow = dynamic_cast<KMenuItem*>(afterNow); ++ ++ QStringList favs = KickerSettings::favorites(); ++ QStringList::Iterator it; ++ QString addFav = QString::null; ++ ++ // remove at old position ++ if (kitem->service()) ++ { ++ favs.erase(favs.find(kitem->service()->storageId())); ++ addFav = kitem->service()->storageId(); ++ } ++ else ++ { ++ for (it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/') ++ { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==kitem->path()) ++ { ++ addFav = *it; ++ favs.erase(it); ++ break; ++ } ++ } ++ } ++ } ++ ++ if (addFav.isEmpty()) ++ return; ++ ++ if (!kafterNow || dynamic_cast<KMenuSpacer*>(afterNow)) ++ { ++ favs.prepend(addFav); ++ } ++ else ++ { ++ // add at new position ++ for (it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/' && !kafterNow->service()) ++ { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==kafterNow->path()) ++ { ++ kdDebug() << "insert after " << kafterNow->path() << endl; ++ favs.insert(++it,addFav); ++ break; ++ } ++ } ++ else if (kafterNow->service() && *it==kafterNow->service()->storageId()) ++ { ++ kdDebug() << "insert after service " << kafterNow->service() << endl; ++ favs.insert(++it,addFav); ++ break; ++ } ++ } ++ } ++ kdDebug() << "favs " << favs << endl; ++ ++ KickerSettings::setFavorites(favs); ++ KickerSettings::writeConfig(); ++ ++ m_favoriteView->slotMoveContent(); ++} ++ ++void KMenu::updateMedia() ++{ ++ QStringList devices = m_mediaWatcher->devices(); ++ if ( devices.isEmpty() ) ++ return; ++ ++ int nId = serviceMenuStartId(); ++ if ( m_media_id ) { ++ for ( int i = m_media_id + 1 ;; ++i ) ++ { ++ KMenuItem *item = m_systemView->findItem( i ); ++ if ( !item ) ++ break; ++ if ( !item->path().startsWith( "system:/" ) ) ++ break; ++ media_mimetypes.remove(item->path()); ++ delete item; ++ } ++ nId = m_media_id + 1; ++ } else { ++ m_media_id = nId; ++ m_systemView->insertSeparator( nId++, i18n("Media"), -1); ++ } ++ ++ for ( QStringList::ConstIterator it = devices.constBegin(); it != devices.constEnd(); ++it ) ++ { ++ QString id = ( *it ); ++ QString name = *++it; ++ QString label = *++it; ++ QString userLabel = ( *++it ); ++ bool mountable = ( *++it == "true" ); // bool ++ ( void )mountable; ++ QString deviceNode = ( *++it ); ++ QString mountPoint = ( *++it ); ++ QString fsType = ( *++it ); ++ bool mounted = ( *++it == "true" ); // bool ++ QString baseURL = ( *++it ); ++ QString mimeType = ( *++it ); ++ QString iconName = ( *++it ); ++ ++ media_mimetypes["system:/media/"+name] = mimeType; ++ ++ if ( iconName.isEmpty() ) // no user icon, query the MIME type ++ { ++ KMimeType::Ptr mime = KMimeType::mimeType( mimeType ); ++ iconName = mime->icon( QString::null, false ); ++ } ++ ++ QString descr = deviceNode; ++ if ( mounted ) ++ { ++ descr = mountPoint; ++ // calc the free/total space ++ struct statfs sfs; ++ if ( statfs( QFile::encodeName( mountPoint ), &sfs ) == 0 ) ++ { ++ uint64_t total = ( uint64_t )sfs.f_blocks * sfs.f_bsize; ++ uint64_t avail = ( uint64_t )( getuid() ? sfs.f_bavail : sfs.f_bfree ) * sfs.f_bsize; ++ if ( avail < total && avail > 1024 ) { ++ label += " " + i18n( "(%1 available)" ).arg( KIO::convertSize(avail) ); ++ } ++ } ++ } ++ m_systemView->insertItem( iconName, userLabel.isEmpty() ? label : userLabel, ++ descr, "system:/media/" + name, nId++, -1 ); ++ ++ ++it; // skip separator ++ } ++} ++ ++bool KMenu::ensureServiceRunning(const QString & service) ++{ ++ QStringList URLs; ++ QByteArray data, replyData; ++ QCString replyType; ++ QDataStream arg(data, IO_WriteOnly); ++ arg << service << URLs; ++ ++ if ( !kapp->dcopClient()->call( "klauncher", "klauncher", "start_service_by_desktop_name(QString,QStringList)", ++ data, replyType, replyData) ) { ++ qWarning( "call to klauncher failed."); ++ return false; ++ } ++ QDataStream reply(replyData, IO_ReadOnly); ++ ++ if ( replyType != "serviceResult" ) ++ { ++ qWarning( "unexpected result '%s' from klauncher.", replyType.data()); ++ return false; ++ } ++ int result; ++ QCString dcopName; ++ QString error; ++ reply >> result >> dcopName >> error; ++ if (result != 0) ++ { ++ qWarning("Error starting: %s", error.local8Bit().data()); ++ return false; ++ } ++ return true; ++} ++ ++void KMenu::slotFavDropped(QDropEvent * ev, QListViewItem *after ) ++{ ++ QStringList favs = KickerSettings::favorites(); ++ KMenuItem *newItem = 0; ++ ++ if (KMenuItemDrag::canDecode(ev)) ++ { ++ KMenuItemInfo item; ++ KMenuItemDrag::decode(ev,item); ++ ++ if (item.m_s) ++ { ++ if (favs.find(item.m_s->storageId())==favs.end()) ++ { ++ newItem = m_favoriteView->insertMenuItem(item.m_s, serviceMenuEndId()+favs.count()+1); ++ favs += item.m_s->storageId(); ++ } ++ } ++ else ++ { ++ QString uri = item.m_path; ++ if (uri.startsWith(locateLocal("data", QString::fromLatin1("RecentDocuments/")))) { ++ KDesktopFile df(uri,true); ++ uri=df.readURL(); ++ } ++ ++ QStringList::Iterator it; ++ for (it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/') ++ { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==uri) ++ break; ++ } ++ } ++ if (it==favs.end()) ++ { ++ QString file = KickerLib::newDesktopFile(uri); ++ KDesktopFile df(file); ++ df.writeEntry("Encoding", "UTF-8"); ++ df.writeEntry("Type","Link"); ++ df.writeEntry("Name", item.m_title); ++ df.writeEntry("GenericName", item.m_description); ++ df.writeEntry("Icon", item.m_icon); ++ df.writeEntry("URL", uri); ++ ++ newItem = m_favoriteView->insertItem(item.m_icon, item.m_title, item.m_description, ++ uri, serviceMenuEndId()+favs.count()+1, -1); ++ favs += file; ++ } ++ } ++ } ++ else if (QTextDrag::canDecode(ev)) ++ { ++ QString text; ++ QTextDrag::decode(ev,text); ++ ++ if (text.endsWith(".desktop")) ++ { ++ KService::Ptr p = KService::serviceByDesktopPath(text.replace("file://",QString::null)); ++ if (p && favs.find(p->storageId())==favs.end()) { ++ newItem = m_favoriteView->insertMenuItem(p, serviceMenuEndId()+favs.count()+1); ++ favs+=p->storageId(); ++ } ++ } ++ else ++ { ++ QStringList::Iterator it; ++ for (it = favs.begin(); it != favs.end(); ++it) ++ { ++ if ((*it)[0]=='/') ++ { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==text) ++ break; ++ } ++ } ++ if (it==favs.end()) ++ { ++ KFileItem* item = new KFileItem(text, QString::null, KFileItem::Unknown); ++ KURL kurl(text); ++ ++ QString file = KickerLib::newDesktopFile(text); ++ KDesktopFile df(file); ++ df.writeEntry("Encoding", "UTF-8"); ++ df.writeEntry("Type","Link"); ++ df.writeEntry("Name", item->name()); ++ df.writeEntry("GenericName", i18n("Directory: %1").arg(kurl.upURL().path())); ++ df.writeEntry("Icon", item->iconName()); ++ df.writeEntry("URL", text); ++ ++ newItem = m_favoriteView->insertItem(item->iconName(), item->name(), i18n("Directory: %1").arg(kurl.upURL().path()), text, serviceMenuEndId()+favs.count()+1, -1); ++ favs += file; ++ } ++ } ++ } ++ ++ if ( newItem ) { ++ if (!after && m_favoriteView->childCount()>0) { ++ newItem->moveItem( m_favoriteView->firstChild() ); ++ m_favoriteView->firstChild()->moveItem( newItem ); ++ } ++ else ++ newItem->moveItem( after ); ++ KickerSettings::setFavorites(favs); ++ slotFavoritesMoved( newItem, 0, after ); ++ } ++ m_stacker->raiseWidget(m_favoriteView); ++} ++ ++void KMenu::resetOverflowCategory() ++{ ++ if (m_overflowCategoryState==NotNeeded) ++ m_overflowList.setAutoDelete( true ); ++ ++ m_overflowList.clear(); ++ m_overflowList.setAutoDelete( false ); ++ m_overflowCategoryState = None; ++ m_overflowCategory = num_categories; ++} ++ ++void KMenu::fillOverflowCategory() ++{ ++ if (m_overflowCategoryState==Filling) { ++ initCategoryTitlesUpdate(); ++ for (HitMenuItem * item = m_overflowList.first(); item; item = m_overflowList.next() ) { ++ max_category_id [item->category]++; ++ item->id=max_category_id [item->category]; ++ ++ KMenuItem *hit_item = m_searchResultsWidget->insertItem(iconForHitMenuItem(item), item->display_name, item->display_info, item->uri.url(), max_category_id [item->category], getHitMenuItemPosition (item)); ++ hit_item->setService(item->service); ++ } ++ updateCategoryTitles(); ++ } ++} ++ ++int KMenu::max_items(int category) const ++{ ++ if (category==ACTIONS) ++ return 10; ++ ++ return 5; ++} ++ ++#define DBUS_HAL_INTERFACE "org.freedesktop.Hal" ++#define DBUS_HAL_SYSTEM_POWER_INTERFACE "org.freedesktop.Hal.Device.SystemPowerManagement" ++#define HAL_UDI_COMPUTER "/org/freedesktop/Hal/devices/computer" ++ ++#ifdef KDELIBS_SUSE ++#include <liblazy.h> ++#endif ++ ++void KMenu::insertSuspendOption( int &nId, int &index ) ++{ ++#ifdef KDELIBS_SUSE ++ int supported = -1; ++ bool suspend_ram, suspend_disk, standby; ++ ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); ++ if (supported == 1) ++ suspend_ram = true; ++ else ++ suspend_ram = false; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_standby", &supported); ++ if (supported == 1) ++ standby = true; ++ else ++ standby = false; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_hibernate", &supported); ++ if (supported == 1) ++ suspend_disk = true; ++ else ++ suspend_disk = false; ++ ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.hibernate") != 1) ++ suspend_disk = false; ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.suspend") != 1) ++ suspend_ram = false; ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1) ++ standby = false; ++ ++ if ( ! ( standby + suspend_ram + suspend_disk ) ) ++ return; ++ ++ i18n("Suspend Computer"); ++ ++ if ( suspend_disk ) ++ m_exitView->leftView()->insertItem( "suspend2disk", i18n( "Suspend to Disk" ), ++ i18n( "Pause without logging out" ), "kicker:/suspend_disk", nId++, index++ ); ++ ++ if ( suspend_ram ) ++ m_exitView->leftView()->insertItem( "suspend2ram", i18n( "Suspend to RAM" ), ++ i18n( "Pause without logging out" ), "kicker:/suspend_ram", nId++, index++ ); ++ ++ if ( standby ) ++ m_exitView->leftView()->insertItem( "player_pause", i18n( "Standby" ), ++ i18n( "Pause without logging out" ), "kicker:/standby", nId++, index++ ); ++#endif ++} ++ ++void KMenu::slotSuspend(int id) ++{ ++#ifdef KDELIBS_SUSE ++ int error = 0; ++ int wake = 0; ++ DBusMessage *reply = 0; ++ ++ if (id == 1) { ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Hibernate", ++ &reply, ++ DBUS_TYPE_INVALID); ++ } else if (id == 2) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Suspend", ++ &reply, ++ DBUS_TYPE_INT32, ++ &wake, ++ DBUS_TYPE_INVALID); ++ else if (id == 3) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Standby", ++ &reply, ++ DBUS_TYPE_INVALID); ++ else ++ return; ++ if (error) ++#endif ++ KMessageBox::error(this, i18n("Suspend failed")); ++ ++} ++ ++// vim:cindent:sw=4: +--- kicker/ui/kmenuitembase.ui (Revision 0) ++++ kicker/ui/kmenuitembase.ui (Revision 849791) +@@ -0,0 +1,141 @@ ++<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> ++<class>KMenuItemBase</class> ++<widget class="QWidget"> ++ <property name="name"> ++ <cstring>KMenuItemBase</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>514</width> ++ <height>80</height> ++ </rect> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>5</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>0</height> ++ </size> ++ </property> ++ <property name="maximumSize"> ++ <size> ++ <width>32767</width> ++ <height>80</height> ++ </size> ++ </property> ++ <property name="caption"> ++ <string>KMenuItemBase</string> ++ </property> ++ <grid> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>2</number> ++ </property> ++ <widget class="QLayoutWidget" row="0" column="1"> ++ <property name="name"> ++ <cstring>layout11</cstring> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>itemTitle</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>1</vsizetype> ++ <horstretch>1</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="font"> ++ <font> ++ <pointsize>14</pointsize> ++ </font> ++ </property> ++ <property name="text"> ++ <string></string> ++ </property> ++ <property name="textFormat"> ++ <enum>RichText</enum> ++ </property> ++ <property name="alignment"> ++ <set>WordBreak|AlignTop</set> ++ </property> ++ </widget> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>itemDescription</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>7</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>1</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="paletteForegroundColor"> ++ <color> ++ <red>188</red> ++ <green>188</green> ++ <blue>188</blue> ++ </color> ++ </property> ++ <property name="text"> ++ <string></string> ++ </property> ++ <property name="textFormat"> ++ <enum>RichText</enum> ++ </property> ++ <property name="alignment"> ++ <set>WordBreak|AlignTop</set> ++ </property> ++ </widget> ++ </vbox> ++ </widget> ++ <widget class="QLayoutWidget" row="0" column="0"> ++ <property name="name"> ++ <cstring>layout4</cstring> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>itemPixmap</cstring> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>64</width> ++ <height>64</height> ++ </size> ++ </property> ++ <property name="text"> ++ <string></string> ++ </property> ++ <property name="alignment"> ++ <set>AlignTop|AlignHCenter</set> ++ </property> ++ </widget> ++ </vbox> ++ </widget> ++ </grid> ++</widget> ++<layoutdefaults spacing="6" margin="11"/> ++</UI> +--- kicker/ui/addappletvisualfeedback.cpp (Revision 849788) ++++ kicker/ui/addappletvisualfeedback.cpp (Revision 849791) +@@ -51,6 +51,7 @@ + m_richText(0), + m_dissolveDelta(-1), + m_frames(1), ++ m_moveTimer(0, "m_moveTimer"), + m_dirty(false) + { + setFocusPolicy(NoFocus); +--- kicker/ui/kickoff_bar.cpp (Revision 0) ++++ kicker/ui/kickoff_bar.cpp (Revision 849791) +@@ -0,0 +1,200 @@ ++/***************************************************************** ++ ++ Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ Copyright (c) 2006 Dirk Mueller <mueller@kde.org> ++ ++ 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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#include "kickoff_bar.h" ++#include "itemview.h" ++ ++#include <qiconset.h> ++#include <qpainter.h> ++#include <qcursor.h> ++#include <qstyle.h> ++#include <qapplication.h> ++ ++#include <kdebug.h> ++#include "kickerSettings.h" ++ ++KickoffTabBar::KickoffTabBar(QWidget* parent, const char* name) ++ : QTabBar(parent, name), m_tabsActivated(true) ++{ ++ setAcceptDrops(true); ++} ++ ++void KickoffTabBar::deactivateTabs(bool b) ++{ ++ m_tabsActivated = !b; ++ ++ update(); ++} ++ ++void KickoffTabBar::paint(QPainter* p, QTab* t, bool selected) const ++{ ++ QStyle::SFlags flags = QStyle::Style_Default; ++ ++ if (isEnabled() && t->isEnabled()) ++ flags |= QStyle::Style_Enabled; ++ if ( m_tabsActivated && selected ) ++ flags |= QStyle::Style_Selected; ++// else if(t == d->pressed) ++// flags |= QStyle::Style_Sunken; ++ //selection flags ++ if(t->rect().contains(mapFromGlobal(QCursor::pos()))) ++ flags |= QStyle::Style_MouseOver; ++ style().drawControl( QStyle::CE_TabBarTab, p, this, t->rect(), ++ colorGroup(), flags, QStyleOption(t) ); ++ ++ paintLabel( p, t->rect(), t, t->identifier() == keyboardFocusTab() ); ++} ++ ++ ++void KickoffTabBar::paintLabel(QPainter* p, const QRect& br, QTab* t, bool has_focus) const ++{ ++ QRect r = br; ++ ++ bool selected = m_tabsActivated && (currentTab() == t->identifier()); ++ int vframe = style().pixelMetric( QStyle::PM_TabBarTabVSpace, this ); ++ ++ p->setFont( font() ); ++ QFontMetrics fm = p->fontMetrics(); ++ int fw = fm.size( Qt::SingleLine|Qt::ShowPrefix, t->text() ).width(); ++ ++ QRect rt(r); ++ rt.setWidth(fw); ++ ++ if ( t->iconSet()) ++ { ++ // the tab has an iconset, draw it in the right mode ++ QIconSet::Mode mode = (t->isEnabled() && isEnabled()) ++ ? QIconSet::Normal : QIconSet::Disabled; ++ if ( mode == QIconSet::Normal && has_focus ) ++ mode = QIconSet::Active; ++ QPixmap pixmap = t->iconSet()->pixmap( QIconSet::Large, mode ); ++ int pixw = pixmap.width(); ++ int pixh = pixmap.height(); ++ int xoff = br.x() + (br.width() - pixw)/2; ++ int yoff = br.y() + (br.height() - 4 - pixh - ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) - vframe)/2; ++ ++ p->drawPixmap( xoff, 4 + yoff, pixmap ); ++ ++ r.setTop(vframe/2 + yoff + pixh - 8); ++ rt.setTop(vframe/2 + yoff + pixh - 8); ++ rt.setHeight(((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + vframe/2); ++ } ++ else ++ rt.setHeight(vframe/2 + fm.height()); ++ ++ rt.setWidth(fw+8); ++ rt.moveCenter(r.center()); ++ ++ QStyle::SFlags flags = QStyle::Style_Default; ++ ++ if (isEnabled() && t->isEnabled()) ++ flags |= QStyle::Style_Enabled; ++ if (has_focus) ++ flags |= QStyle::Style_HasFocus; ++ if ( selected ) ++ flags |= QStyle::Style_Selected; ++ // else if(t == d->pressed) ++ // flags |= QStyle::Style_Sunken; ++ if(t->rect().contains(mapFromGlobal(QCursor::pos()))) ++ flags |= QStyle::Style_MouseOver; ++ style().drawControl( QStyle::CE_TabBarLabel, p, this, rt, ++ t->isEnabled() ? colorGroup(): palette().disabled(), ++ flags, QStyleOption(t) ); ++} ++ ++QSize KickoffTabBar::sizeHint() const ++{ ++ QSize s = QTabBar::sizeHint(); ++ ++ return s; ++} ++ ++void KickoffTabBar::layoutTabs() ++{ ++ QTabBar::layoutTabs(); ++ ++ QFontMetrics fm = fontMetrics(); ++ int fh = ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + 4; ++ ++ int hframe = style().pixelMetric( QStyle::PM_TabBarTabHSpace, this ); ++ int vframe = style().pixelMetric( QStyle::PM_TabBarTabVSpace, this ); ++ int overlap = style().pixelMetric( QStyle::PM_TabBarTabOverlap, this ); ++ ++ QSize s; ++ for (int t = 0; t < count(); ++t) ++ { ++ QTab* tab = tabAt(t); ++ if (tab->iconSet()) ++ s = s.expandedTo(tab->iconSet()->pixmap(QIconSet::Large, QIconSet::Normal).size()); ++ } ++ ++ int x = 0; ++ for (int t = 0; t < count(); ++t) { ++ QTab* tab = tabAt(QApplication::reverseLayout() ? count() - t - 1 : t); ++ int h = fh; ++ if (tab->iconSet()) ++ h += 4 + s.height() + 4; ++ QRect r = tab->rect(); ++ ++ int fw = fm.size( Qt::SingleLine|Qt::ShowPrefix, tab->text() ).width(); ++ int iw = 0; ++ if ( tab->iconSet() != 0 ) ++ iw = tab->iconSet()->pixmap( QIconSet::Large, QIconSet::Normal ).width(); ++ int w = QMAX(iw, fw + 6 + 6 ) + hframe; ++ h += ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + vframe; ++ tab->setRect(QRect(QPoint(x, 0), style().sizeFromContents(QStyle::CT_TabBarTab, this, ++ QSize(w, h), QStyleOption(tab)))); ++ x += tab->rect().width() - overlap; ++ } ++} ++ ++void KickoffTabBar::dragEnterEvent(QDragEnterEvent* event) ++{ ++ event->accept(KMenuItemDrag::canDecode(event)); ++} ++ ++void KickoffTabBar::dragMoveEvent(QDragMoveEvent* event) ++{ ++ QTab* t = selectTab(event->pos()); ++ ++ // ### uhhh, look away ++ if (t && t->identifier() == 0) ++ { ++ setCurrentTab(t); ++ } ++} ++ ++void KickoffTabBar::mousePressEvent( QMouseEvent * e ) ++{ ++ if ( e->button() != LeftButton ) { ++ e->ignore(); ++ return; ++ } ++ QTab *t = selectTab( e->pos() ); ++ if ( t && t->isEnabled() ) { ++ emit tabClicked(t); ++ } ++ QTabBar::mousePressEvent(e); ++} ++ ++#include "kickoff_bar.moc" ++// vim:cindent:sw=4: +--- kicker/ui/media_watcher.h (Revision 0) ++++ kicker/ui/media_watcher.h (Revision 849791) +@@ -0,0 +1,51 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Stephan Kulow <coolo@novell.com> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#ifndef _media_watcher_ ++#define _media_watcher_ ++ ++#include <dcopobject.h> ++#include <qobject.h> ++#include <qstringlist.h> ++ ++class MediaWatcher : public QObject, public DCOPObject ++{ ++ Q_OBJECT ++ K_DCOP ++ ++ QStringList m_devices; ++ void updateDevices(); ++ ++k_dcop: ++ void slotMediumAdded(QString medium, bool a); ++ ++signals: ++ void mediumChanged(); ++ ++public: ++ MediaWatcher(QObject *parent); ++ ++ QStringList devices() const { return m_devices; } ++}; ++ ++#endif +--- kicker/ui/appletop_mnu.h (Revision 849788) ++++ kicker/ui/appletop_mnu.h (Revision 849791) +@@ -47,6 +47,9 @@ + signals: + void escapePressed(); + ++protected slots: ++ void toggleLegacy(); ++ + protected: + void keyPressEvent(QKeyEvent* e); + }; +--- kicker/ui/flipscrollview.h (Revision 0) ++++ kicker/ui/flipscrollview.h (Revision 849791) +@@ -0,0 +1,118 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Will Stephenson <wstephenson@novell.com> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++/* ++ * Flip scroll menu ++ * Each level of the menu is a separate QListView ++ * Child items are added to their own QListView. ++ * When a parent is clicked, we look up its child menu and insert ++ * that in a QScrollView, then scroll to it. ++ * ++ * Need to intercept QListViewItems' parent param and instead of ++ * inserting directly into parent, insert into parent item's listview ++ * ++ * So need ++ * - adapted QLVI ++ * - wrap QLV and offer same interface ++ */ ++ ++#ifndef FLIPSCROLLVIEW_H ++#define FLIPSCROLLVIEW_H ++ ++#include <qscrollview.h> ++#include <qlistview.h> ++#include <qframe.h> ++#include <qtimer.h> ++#include <qpainter.h> ++#include <kstandarddirs.h> ++#include "service_mnu.h" ++ ++class ItemView; ++ ++class BackFrame : public QFrame ++{ ++ Q_OBJECT ++ ++public: ++ BackFrame( QWidget *parent ); ++ virtual void drawContents( QPainter *p ); ++ ++ void enterEvent ( QEvent * ); ++ void leaveEvent( QEvent * ); ++ void mousePressEvent ( QMouseEvent * e ); ++ ++signals: ++ void clicked(); ++ ++private: ++ QPixmap left_triangle; ++ bool mouse_inside; ++}; ++ ++class FlipScrollView : public QScrollView ++{ ++ Q_OBJECT ++public: ++ enum State{ StoppedLeft, StoppedRight, ScrollingLeft, ScrollingRight }; ++ FlipScrollView( QWidget * parent = 0, const char * name = 0 ); ++ ~FlipScrollView(); ++ ++ ItemView *currentView() const; ++ ItemView *leftView() const; ++ ItemView *rightView() const; ++ ItemView *prepareLeftMove(bool clear=true); ++ ItemView *prepareRightMove(); ++ ++ void flipScroll(const QString& selectMenuPath = QString::null); ++ void showBackButton(bool enable); ++ bool showsBackButton() const {return mShowBack;} ++ ++protected slots: ++ void slotScrollTimer(); ++ ++signals: ++ void startService(KService::Ptr kservice); ++ void startURL(const QString& u); ++ void rightButtonPressed(QListViewItem*,const QPoint&,int); ++ void backButtonClicked(); ++ ++protected: ++ void viewportResizeEvent ( QResizeEvent * ); ++ ++private: ++ ItemView * mLeftView; ++ ItemView * mRightView; ++// ItemView * mCurrentView; ++ int mStepsRemaining; ++ State mState; ++ QTimer * mTimer; ++ BackFrame *mBackrow; ++ QString mSelectMenuPath; ++ int mScrollDirection; ++ bool mShowBack; ++}; ++ ++ ++ ++ ++#endif +--- kicker/ui/k_new_mnu.h (Revision 0) ++++ kicker/ui/k_new_mnu.h (Revision 849791) +@@ -0,0 +1,342 @@ ++/***************************************************************** ++ ++ Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ Copyright (c) 2006 Debajyoti Bera <dbera.web@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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#ifndef __k_new_mnu_h__ ++#define __k_new_mnu_h__ ++ ++#include <dcopobject.h> ++#include <qintdict.h> ++#include <qpixmap.h> ++#include <qframe.h> ++#include <qtoolbutton.h> ++#include <qscrollview.h> ++#include <qtimer.h> ++#include <qbitmap.h> ++#include <qvbox.h> ++#include <qregexp.h> ++ ++#include <kabc/addressbook.h> ++#include <kabc/stdaddressbook.h> ++#include "../interfaces/kickoff-search-plugin.h" ++ ++#include "kmenubase.h" ++#include "service_mnu.h" ++#include "query.h" ++ ++class KickerClientMenu; ++class KickoffTabBar; ++class KBookmarkMenu; ++class KActionCollection; ++class KBookmarkOwner; ++class Panel; ++class QWidgetStack; ++class KHistoryCombo; ++class QScrollView; ++class PopupMenuTitle; ++class MediaWatcher; ++class KURIFilterData; ++class KBookmarkGroup; ++class KBookmarkManager; ++class ItemView; ++class FlipScrollView; ++class QListViewItem; ++class KMenuItem; ++class QListView; ++class QTabBar; ++class QTab; ++ ++static QString categories[14] = {I18N_NOOP("Actions"), I18N_NOOP("Applications"), I18N_NOOP("Bookmarks"), ++ I18N_NOOP("Notes"), I18N_NOOP("Emails"), I18N_NOOP("Files"), I18N_NOOP("Music"), ++ I18N_NOOP("Browsing History"), I18N_NOOP("Chat Logs"), I18N_NOOP("Feeds"), ++ I18N_NOOP("Pictures"), I18N_NOOP("Videos"), I18N_NOOP("Documentation"), ++ I18N_NOOP("Others")}; ++ ++static QString kerry_categories[14] = {"contacts", "applications", "webpages", "everything", "conversations", ++ "everything", "media", "webpages", "conversations", "webpages", "images", ++ "media", "everything", "everything"}; ++ ++enum MenuOrientation { BottomUp, TopDown, UnDetermined }; ++enum OverflowCategoryState { None, Filling, NotNeeded }; ++ ++class KMenu : public KMenuBase ++{ ++ Q_OBJECT ++ Q_PROPERTY (bool KStyleMenuDropShadow READ useKStyleMenuDropShadow ) ++ ++public: ++ KMenu(); ++ ~KMenu(); ++ ++ int insertClientMenu(KickerClientMenu *p); ++ void removeClientMenu(int id); ++ ++ bool useKStyleMenuDropShadow() const { return true; } ++ ++ virtual void showMenu(); ++ virtual bool eventFilter(QObject*, QEvent*); ++ ++ void clearRecentAppsItems(); ++ void clearRecentDocsItems(); ++ bool highlightMenuItem(const QString& /*id*/) { return false;} ++ ++ void selectFirstItem() {} ++ void popup(const QPoint&, int indexAtPoint); ++ ++ enum MaskEffect { Plain, Dissolve }; ++ ++ virtual QSize sizeHint() const; ++ virtual QSize minimumSizeHint() const; ++ ++ void searchOver(); ++ void initCategoryTitlesUpdate(); ++ bool anotherHitMenuItemAllowed(int cat, bool count=true); ++ void addHitMenuItem(HitMenuItem*); ++ void insertSearchResult(HitMenuItem* item); ++ ++ void updateCategoryTitles(); ++ ++signals: ++ void aboutToHide(); ++ void aboutToShow(); ++ ++public slots: ++ virtual void initialize(); ++ ++ virtual void hide(); ++ virtual void show(); ++ ++ void stackWidgetRaised(QWidget*); ++ ++protected slots: ++ void slotLock(); ++ void slotOpenHomepage(); ++ void slotLogout(); ++ void slotPopulateSessions(); ++ void slotSessionActivated( int ); ++ void slotGoSubMenu(const QString& relPath); ++ void slotGoBack(); ++ void slotGoExitMainMenu(); ++ void slotGoExitSubMenu(const QString& url); ++ void tabClicked(QTab*); ++ ++ void paletteChanged(); ++ virtual void configChanged(); ++ void updateRecent(); ++ ++ void initSearch(); ++ void searchAccept(); ++ void searchChanged(const QString &); ++ // when timeout happens or doQueryNow calls ++ void doQuery (bool return_pressed = false); ++ void searchActionClicked(QListViewItem*); ++ ++ void slotStartService(KService::Ptr); ++ void slotStartURL(const QString&); ++ void slotContextMenuRequested( QListViewItem * item, const QPoint & pos, int col ); ++ ++ void clearedHistory(); ++ ++ void slotSloppyTimeout(); ++ ++ void slotContextMenu(int); ++ void slotFavoritesMoved( QListViewItem*, QListViewItem*, QListViewItem* ); ++ ++ void updateMedia(); ++ void slotFavDropped(QDropEvent * e, QListViewItem *after ); ++ void slotSuspend(int id); ++ ++protected: ++ virtual void paintEvent(QPaintEvent *); ++ virtual void resizeEvent ( QResizeEvent * ); ++ virtual void mousePressEvent ( QMouseEvent * e ); ++ virtual void mouseReleaseEvent ( QMouseEvent * e ); ++ virtual void mouseMoveEvent ( QMouseEvent * e ); ++ ++ void doNewSession(bool lock); ++ void createRecentMenuItems(); ++ void insertStaticItems(); ++ void insertStaticExitItems(); ++ void insertSuspendOption( int &id, int &index ); ++ virtual void clearSubmenus(); ++// void raiseStackWidget(QWidget *view); ++ ++ bool runCommand(); ++ ++ void setupUi(); ++ ++ void saveConfig(); ++ void searchProgramList(QString relPath); ++ void searchBookmarks(KBookmarkGroup); ++ void searchAddressbook(); ++ ++ void createNewProgramList(); ++ void createNewProgramList(QString relPath); ++ ++ void paintSearchTab( bool active ); ++ ++ void goSubMenu(const QString& relPath, bool keyboard = false); ++ void setOrientation(MenuOrientation orientation); ++ ++private: ++ int serviceMenuStartId() { return 5242; } ++ int serviceMenuEndId() { return 5242; } ++ ++ void fillMenu( KServiceGroup::Ptr &_root, KServiceGroup::List &_list, ++ const QString &_relPath, ItemView* view, int & id ); ++ ++ void fillSubMenu(const QString& relPath, ItemView *view); ++ ++ QPopupMenu *sessionsMenu; ++ int client_id; ++ bool delay_init; ++ QIntDict<KickerClientMenu> clients; ++ KActionCollection *actionCollection; ++ PopupMenuList dynamicSubMenus; ++ ++ QTimer m_sloppyTimer; ++ QTimer m_mediaFreeTimer; ++ MediaWatcher * m_mediaWatcher; ++ QRegion m_sloppyRegion; ++ QRect m_sloppySource; ++ bool m_sloppySourceClicked; ++ QWidget * m_sloppyWidget; ++ ItemView * m_recentlyView; ++ ItemView * m_favoriteView; ++ ItemView * m_searchResultsWidget; ++ QListView * m_searchActions; ++ FlipScrollView * m_browserView; ++ ItemView * m_systemView; ++ FlipScrollView * m_exitView; ++ QVBox * m_searchWidget; ++ QLabel * m_resizeHandle; ++ ++ bool m_isresizing; ++ // timer for search without pressing enter feature ++ QTimer *input_timer, *init_search_timer; ++ ++ Query current_query; ++ ++ bool dontQueryNow(const QString &); ++ ++ // start timeout timer to call doQuery is enough time has passed since last keypress ++ void checkToDoQuery (const QString &); ++ // when return is pressed ++ void doQueryNow (); ++ void clearSearchResults(bool showHelp = true); ++ ++ int *max_category_id; // maximum id in this category: max_category_id - base_category_id gives the current number of hits displayed in this category ++ int *categorised_hit_total; // current number of hits returned in each category ++ ++ bool ensureServiceRunning(const QString & service); ++ ++ QString iconForHitMenuItem(HitMenuItem *hit_item); ++ ++ int getHitMenuItemPosition (HitMenuItem *hit_item); ++ QMap<QString, QString> mimetype_iconstore; ++ QMap<QString, QString> media_mimetypes; ++ // report error as a menu item ++ void reportError (QString err); ++ void addToHistory(); ++ ++ int max_items(int category) const; ++ QString TOP_CATEGORY_STRING; ++ bool *already_added; ++ ++ void notifyServiceStarted(KService::Ptr service); ++ void parseLine( bool final ); ++ QString m_iconName; ++ QStringList m_middleFilters; ++ QStringList m_finalFilters; ++ KURIFilterData* m_filterData; ++ QPtrList<HitMenuItem> m_current_menu_items; ++ QListViewItem *m_searchIndex, *m_searchInternet; ++ ++ bool checkUriInMenu(const KURL &uri); ++ ++ QRegExp emailRegExp,uriRegExp,uri2RegExp,authRegExp; ++ ++ KBookmarkManager *bookmarkManager; ++ KABC::AddressBook* m_addressBook; ++ ++ enum ContextMenuEntry { AddItemToPanel, EditItem, AddMenuToPanel, EditMenu, ++ AddItemToDesktop, AddMenuToDesktop, PutIntoRunDialog, ++ AddToFavorites, RemoveFromFavorites, ClearRecentlyUsedApps, ++ ClearRecentlyUsedDocs }; ++ struct PopupPath ++ { ++ QString title, description, icon, path, menuPath; ++ }; ++ ++ enum KickoffTabEntry { FavoriteTab, ApplicationsTab, ComputerTab, ++ HistoryTab, LeaveTab, SearchTab, NumTabs }; ++ ++ KPopupMenu* m_popupMenu; ++ KService* m_popupService; ++ PopupPath m_popupPath; ++ ++ KickoffTabBar* m_tabBar; ++ QTab* m_tabs[NumTabs]; ++ ++ QString newDesktopFile(const KURL& url, const QString &directory); ++ void updateRecentlyUsedApps(KService::Ptr &service); ++ ++ QPixmap main_border_lc; ++ QPixmap main_border_rc; ++ QPixmap main_border_tl; ++ QPixmap main_border_tr; ++ QPixmap button_box_left; ++ ++ QPixmap search_tab_left; ++ QPixmap search_tab_right; ++ QPixmap search_tab_center; ++ ++ QPixmap search_tab_top_left; ++ QPixmap search_tab_top_right; ++ QPixmap search_tab_top_center; ++ ++ QWidgetStack *m_stacker; ++ ++ QStringList m_programsInMenu; ++ QStringList m_newInstalledPrograms, m_seenPrograms; ++ bool m_seenProgramsChanged; ++ QString m_currentDate; ++ ++ MenuOrientation m_orientation; ++ bool m_toolTipsEnabled; ++ int m_media_id; ++ ++ bool m_recentDirty, m_browserDirty, m_kerryInstalled, m_isShowing; ++ ++ KickoffSearch::Plugin* m_search_plugin; ++ QObject* m_search_plugin_interface; ++ ++ OverflowCategoryState m_overflowCategoryState; ++ QPtrList<HitMenuItem> m_overflowList; ++ int m_overflowCategory; ++ ++ void resetOverflowCategory(); ++ void fillOverflowCategory(); ++ ++ QString insertBreaks(const QString& text, QFontMetrics fm, int width, QString leadInsert = QString::null); ++}; ++ ++#endif +--- kicker/ui/appletop_mnu.cpp (Revision 849788) ++++ kicker/ui/appletop_mnu.cpp (Revision 849791) +@@ -30,6 +30,7 @@ + #include "appletop_mnu.h" + #include "container_button.h" + #include "containerarea.h" ++#include "kickerSettings.h" + + PanelAppletOpMenu::PanelAppletOpMenu(int actions, QPopupMenu *opMenu, const QPopupMenu* appletsMenu, + const QString & title, const QString &icon, +@@ -159,6 +160,20 @@ + } + } + ++ if ((actions & PanelAppletOpMenu::KMenuEditor)) ++ { ++ if (needSeparator) ++ { ++ insertSeparator(); ++ needSeparator = false; ++ } ++ ++ if (KickerSettings::legacyKMenu()) ++ insertItem(SmallIcon("suse"), i18n("Switch to SUSE Menu Style"), this, SLOT(toggleLegacy())); ++ else ++ insertItem(SmallIcon("about_kde"), i18n("Switch to KDE Menu Style"), this, SLOT(toggleLegacy())); ++ } ++ + if ((actions & PanelAppletOpMenu::KMenuEditor) && kapp->authorizeKAction("menuedit")) + { + if (needSeparator) +@@ -205,4 +220,11 @@ + QPopupMenu::keyPressEvent(e); + } + ++void PanelAppletOpMenu::toggleLegacy() ++{ ++ KickerSettings::setLegacyKMenu(!KickerSettings::legacyKMenu()); ++ KickerSettings::writeConfig(); ++ Kicker::the()->restart(); ++} ++ + #include "appletop_mnu.moc" +--- kicker/ui/kmenubase.ui (Revision 0) ++++ kicker/ui/kmenubase.ui (Revision 849791) +@@ -0,0 +1,300 @@ ++<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> ++<class>KMenuBase</class> ++<widget class="QDialog"> ++ <property name="name"> ++ <cstring>KMenu</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>723</width> ++ <height>580</height> ++ </rect> ++ </property> ++ <property name="caption"> ++ <string>KMenu</string> ++ </property> ++ <property name="frameShadow" stdset="0"> ++ <string>MShadow</string> ++ </property> ++ <property name="frameShape" stdset="0"> ++ <string>MShape</string> ++ </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>m_search</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>20</x> ++ <y>40</y> ++ <width>190</width> ++ <height>54</height> ++ </rect> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <property name="spacing"> ++ <number>0</number> ++ </property> ++ <widget class="QFrame"> ++ <property name="name"> ++ <cstring>m_searchFrame</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>5</hsizetype> ++ <vsizetype>0</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>52</height> ++ </size> ++ </property> ++ <property name="maximumSize"> ++ <size> ++ <width>32767</width> ++ <height>52</height> ++ </size> ++ </property> ++ <property name="frameShape"> ++ <enum>StyledPanel</enum> ++ </property> ++ <property name="frameShadow"> ++ <enum>Raised</enum> ++ </property> ++ <property name="lineWidth"> ++ <number>0</number> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout18</cstring> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_searchLabel</cstring> ++ </property> ++ <property name="backgroundOrigin"> ++ <enum>ParentOrigin</enum> ++ </property> ++ <property name="font"> ++ <font> ++ <pointsize>14</pointsize> ++ </font> ++ </property> ++ <property name="text"> ++ <string>Search:</string> ++ </property> ++ </widget> ++ <widget class="KHistoryCombo"> ++ <property name="name"> ++ <cstring>m_kcommand</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>0</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_searchPixmap</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>1</hsizetype> ++ <vsizetype>1</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>32</width> ++ <height>32</height> ++ </size> ++ </property> ++ <property name="maximumSize"> ++ <size> ++ <width>32</width> ++ <height>32</height> ++ </size> ++ </property> ++ <property name="backgroundMode"> ++ <enum>PaletteBackground</enum> ++ </property> ++ <property name="backgroundOrigin"> ++ <enum>ParentOrigin</enum> ++ </property> ++ <property name="scaledContents"> ++ <bool>true</bool> ++ </property> ++ </widget> ++ </hbox> ++ </widget> ++ </hbox> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer5_2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Preferred</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>16</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ </hbox> ++ </widget> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>m_footer</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>20</x> ++ <y>110</y> ++ <width>407</width> ++ <height>34</height> ++ </rect> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>4</number> ++ </property> ++ <property name="spacing"> ++ <number>4</number> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_userInfo</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>3</hsizetype> ++ <vsizetype>0</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>User&nbsp;<b>user</b>&nbsp;on&nbsp;<b>host</b></string> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer13_2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>MinimumExpanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>10</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ <widget class="QToolButton"> ++ <property name="name"> ++ <cstring>m_branding</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>4</hsizetype> ++ <vsizetype>4</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="maximumSize"> ++ <size> ++ <width>90</width> ++ <height>24</height> ++ </size> ++ </property> ++ <property name="text"> ++ <string></string> ++ </property> ++ <property name="iconSet"> ++ <iconset>image0</iconset> ++ </property> ++ <property name="usesBigPixmap"> ++ <bool>true</bool> ++ </property> ++ <property name="autoRaise"> ++ <bool>true</bool> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer13</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Fixed</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>14</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ </hbox> ++ </widget> ++</widget> ++<customwidgets> ++</customwidgets> ++<images> ++ <image name="image0"> ++ <data format="XPM.GZ" length="2522">789cdd933d6fdb30104077ff0a21de8c82b12d5bb2507448f6021d0b141dc82369d9116d7d50b1ada2ffbdbca3c4444950244032b4b790efce7cd29de8eb59f4fddbd768763d692cb73b8820e7753493ad31971f3fbffc9a5c6d36d17219c5f36871f56972e57e104dd7324be325a2464cd24cc60a5120a6731eaf046241c879b64e113bc44dcc751223da802bc41de16ac092508a753a4754885922440a8892301332a5e79e10f91c169b0cf1963083345b231a423ee0bec78dc71c51c420393578249432e664be2354d2bd17628d0889cc0447bc20cab9d490205601a9df29e142cd3d9e0933b59234ba0321576b49d3d8f69878bc41544b952a6abf218c9590f41a9c70a5c0e33d21e885a2e1b4883ad1a9de2032420ac20f8affde3df5415bdea7f8b8c0fbed507fa59b0bf02119739f9172b46e755fc819dbf55bd07ba15fef0ec7f6b41f728c0dcf84bbc76ebedfbfde0d2042eb8fdd5b801de5b794281e06f716f7ee710f619d5227a1b01b1d0aeedc18e366660ec7b2ac18ab1d1a9745acd1ad3161f28631dbbb716d86c29112c2f86363770ec20a383a89b51a9a06b4b5503a2c10dd771b46d98cdcac180a052528cc13b781b6bd7759506d5b435541ddb6161cba16c0f5a174383872b3729057c19dbfe06ed16ddab642b7324638b77b870add3eaae76e1fb577db17e7fdcc5d586bcd5fddc59bdda7deed7d83db580a81ee93bb906eefd4ee0fa24201ddda53f9d4ad4ce92605fae466713843614ceddd17b83008d1b06618bd2b5e42de3da70b7019dfc1b2eb3af7e140a9ae7342d3d152babb75ee1a76ea7c9478ea5c92bd3bf6c7a870f6677cdc8cdd7d840bf40ef1cc7dfb716efd81eef78c7fd6fdfbf3e40f51236246</data> ++ </image> ++</images> ++<includes> ++ <include location="local" impldecl="in implementation">kmenubase.ui.h</include> ++</includes> ++<functions> ++ <function access="private" specifier="non virtual">init()</function> ++</functions> ++<layoutdefaults spacing="6" margin="11"/> ++<includehints> ++ <includehint>kcombobox.h</includehint> ++</includehints> ++</UI> +--- kicker/ui/kickoff_bar.h (Revision 0) ++++ kicker/ui/kickoff_bar.h (Revision 849791) +@@ -0,0 +1,53 @@ ++/***************************************************************** ++ ++ Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ Copyright (c) 2006 Dirk Mueller <mueller@kde.org> ++ ++ 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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#ifndef __kickoff_bar_h__ ++#define __kickoff_bar_h__ ++ ++#include <qtabbar.h> ++ ++class KickoffTabBar : public QTabBar ++{ ++ Q_OBJECT ++public: ++ KickoffTabBar(QWidget* parent, const char* name); ++ ++ void deactivateTabs(bool b); ++ virtual QSize sizeHint() const; ++ ++protected: ++ virtual void paint(QPainter*, QTab*, bool) const; ++ virtual void paintLabel(QPainter* p, const QRect& br, QTab* t, bool has_focus) const; ++ virtual void layoutTabs(); ++ virtual void dragEnterEvent(QDragEnterEvent*); ++ virtual void dragMoveEvent(QDragMoveEvent*); ++ virtual void mousePressEvent ( QMouseEvent * ); ++ ++signals: ++ void tabClicked(QTab*); ++ ++private: ++ bool m_tabsActivated; ++}; ++ ++ ++#endif +--- kicker/ui/k_mnu_stub.cpp (Revision 0) ++++ kicker/ui/k_mnu_stub.cpp (Revision 849791) +@@ -0,0 +1,141 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Dirk Mueller <mueller@kde.org> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#include "k_mnu_stub.h" ++#include "k_new_mnu.h" ++#include "k_mnu.h" ++ ++void KMenuStub::removeClientMenu(int id) ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->removeClientMenu(id); ++ return m_w.panelkmenu->removeClientMenu(id); ++} ++ ++int KMenuStub::insertClientMenu(KickerClientMenu *p) ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->insertClientMenu(p); ++ return m_w.panelkmenu->insertClientMenu(p); ++} ++ ++void KMenuStub::adjustSize() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->adjustSize(); ++ return m_w.panelkmenu->adjustSize(); ++} ++ ++void KMenuStub::hide() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->hide(); ++ return m_w.panelkmenu->hide(); ++} ++ ++void KMenuStub::show() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->show(); ++ return m_w.panelkmenu->show(); ++} ++ ++void KMenuStub::showMenu() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->showMenu(); ++ return m_w.panelkmenu->showMenu(); ++} ++ ++#if 0 ++void KMenuStub::resize() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->resize(); ++ return m_w.panelkmenu->resize(); ++} ++#endif ++ ++void KMenuStub::popup(const QPoint &pos, int indexAtPoint) ++{ ++ return m_type == t_KMenu ? ++ m_w.kmenu->popup(pos, indexAtPoint) ++ : m_w.panelkmenu->popup(pos, indexAtPoint); ++} ++ ++void KMenuStub::selectFirstItem() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->selectFirstItem(); ++ return m_w.panelkmenu->selectFirstItem(); ++} ++ ++void KMenuStub::resize(int w, int h) ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->resize(w, h); ++ return m_w.panelkmenu->resize(w, h); ++} ++ ++QSize KMenuStub::sizeHint() const ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->sizeHint(); ++ return m_w.panelkmenu->sizeHint(); ++} ++ ++bool KMenuStub::highlightMenuItem( const QString &menuId ) ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->highlightMenuItem(menuId); ++ return m_w.panelkmenu->highlightMenuItem(menuId); ++} ++ ++void KMenuStub::clearRecentMenuItems() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->clearRecentAppsItems(); ++ return m_w.panelkmenu->clearRecentMenuItems(); ++} ++ ++void KMenuStub::initialize() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->initialize(); ++ return m_w.panelkmenu->initialize(); ++} ++ ++bool KMenuStub::isVisible() const ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu->isVisible(); ++ return m_w.panelkmenu->isVisible(); ++} ++ ++QWidget* KMenuStub::widget() ++{ ++ if(m_type == t_KMenu) ++ return m_w.kmenu; ++ return m_w.panelkmenu; ++} ++ +--- kicker/ui/kmenubase.ui.h (Revision 0) ++++ kicker/ui/kmenubase.ui.h (Revision 849791) +@@ -0,0 +1,9 @@ ++#include <X11/Xlib.h> ++ ++void KMenuBase::init() ++{ ++ XSetWindowAttributes attrs; ++ attrs.override_redirect = True; ++ XChangeWindowAttributes( qt_xdisplay(), winId(), CWOverrideRedirect, &attrs ); ++ setWFlags( Qt::WType_Popup ); ++} +--- kicker/ui/mykickoffsearchinterface.h (Revision 0) ++++ kicker/ui/mykickoffsearchinterface.h (Revision 849791) +@@ -0,0 +1,47 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * * ++ * 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. * ++ ***************************************************************************/ ++ ++#ifndef MYKICKOFFSEARCHINTERFACE_H ++#define MYKICKOFFSEARCHINTERFACE_H ++ ++#include "../interfaces/kickoffsearchinterface.h" ++ ++class KMenu; ++ ++using namespace KickoffSearch; ++ ++class MyKickoffSearchInterface :public KickoffSearchInterface ++{ ++ Q_OBJECT ++ ++public: ++ MyKickoffSearchInterface( KMenu*, QObject* parent, const char* name = 0 ); ++ ++ bool anotherHitMenuItemAllowed(int cat); ++ void addHitMenuItem(HitMenuItem* item); ++ void searchOver(); ++ void initCategoryTitlesUpdate(); ++ void updateCategoryTitles(); ++ ++private: ++ KMenu* _menu; ++ ++}; ++ ++#endif /* MYKICKOFFSEARCHINTERFACE_H */ +--- kicker/ui/itemview.h (Revision 0) ++++ kicker/ui/itemview.h (Revision 849791) +@@ -0,0 +1,260 @@ ++/***************************************************************** ++ ++Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#ifndef __itemview_h__ ++#define __itemview_h__ ++ ++#include <dcopobject.h> ++#include <qintdict.h> ++#include <qpixmap.h> ++#include <qframe.h> ++#include <qtoolbutton.h> ++#include <klistview.h> ++#include <qdragobject.h> ++ ++#include "kmenubase.h" ++#include "kmenuitembase.h" ++#include "service_mnu.h" ++ ++class KickerClientMenu; ++class KBookmarkMenu; ++class KActionCollection; ++class KBookmarkOwner; ++class Panel; ++class QWidgetStack; ++class KHistoryCombo; ++class QScrollView; ++class PopupMenuTitle; ++class QWidget; ++class QVBoxLayout; ++class QTimer; ++class KPixmap; ++ ++class KMenuItem : public QListViewItem ++{ ++public: ++ KMenuItem(int nId, QListView* parent) : QListViewItem(parent), m_id(nId) { init(); } ++ KMenuItem(int nId, QListViewItem* parent) : QListViewItem(parent), m_id(nId) { init(); } ++ ~KMenuItem(); ++ ++ void setIcon(const QString& icon, int size); ++ QString icon() const { return m_icon; } ++ void setTitle( const QString& text ); ++ QString title() const { return m_title; } ++ void setToolTip( const QString& text ); ++ QString toolTip() const { return m_tooltip; } ++ void setDescription(const QString& text); ++ QString description() const { return m_description; } ++ void setService(KService::Ptr& s) { m_s = s; } ++ KService::Ptr service() { return m_s; } ++ void setPath(const QString& u) { m_path = u; } ++ QString path() const { return m_path; } ++ void setMenuPath(const QString& u) { m_menuPath = u; } ++ QString menuPath() const { return m_menuPath; } ++ int id() const { return m_id; } ++ void setHasChildren(bool flag); ++ bool hasChildren() const { return m_has_children; } ++ void makeGradient(KPixmap &off, const QColor& c); ++ ++protected: ++ virtual void paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align); ++ virtual void paintCellInter(QPainter* p, const QColorGroup & cg, int column, int width, int align); ++ virtual void setup(); ++ ++private: ++ void init(); ++ ++ int m_id; ++ KService::Ptr m_s; ++ QString m_title; ++ QString m_description; ++ QString m_path; ++ QString m_icon; ++ QString m_tooltip; ++ QString m_menuPath; ++ float title_font_size; ++ float description_font_size; ++ bool m_has_children; ++ int m_old_width; ++ QPixmap right_triangle; ++}; ++ ++class KMenuItemSeparator : public KMenuItem ++{ ++public: ++ KMenuItemSeparator(int nId, QListView* parent); ++ virtual void setup(); ++ ++ virtual void paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align); ++ void setLink(const QString &text, const QString &link = QString::null ); ++ ++ QString linkUrl() const { return m_link_url; } ++ ++ /// returns true if the cursor has to change ++ bool hitsLink(const QPoint &pos); ++ ++protected: ++ void preparePixmap(int width); ++ QPixmap pixmap; ++ int left_margin; ++ ++private: ++ QListView* lv; ++ int cached_width; ++ QString m_link_text, m_link_url; ++ QRect m_link_rect; ++ ++}; ++ ++class KMenuItemHeader : public KMenuItemSeparator ++{ ++public: ++ KMenuItemHeader( int nId, const QString &relpath, QListView* parent); ++ virtual void setup(); ++ ++ virtual void paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align); ++ ++private: ++ QListView* lv; ++ QStringList paths; ++ QStringList texts; ++ QStringList icons; ++ QPixmap left_triangle; ++}; ++ ++class KMenuSpacer : public KMenuItem ++{ ++public: ++ KMenuSpacer(int nId, QListView* parent); ++ virtual void paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align); ++ virtual void setup(); ++ ++ void setHeight(int); ++}; ++ ++class ItemView : public KListView ++{ ++ friend class KMenuItem; ++ ++ Q_OBJECT ++public: ++ ItemView(QWidget* parent, const char* name = 0); ++ ++ KMenuItem* insertItem( const QString& icon, const QString& text, const QString& description, int nId, int nIndex, KMenuItem* parentItem = 0 ); ++ KMenuItem* insertItem( const QString& icon, const QString& text, const QString& description, const QString& path, int nId, int nIndex, KMenuItem* parentItem = 0 ); ++ int insertItem( PopupMenuTitle*, int, int); ++ int setItemEnabled(int id, bool enabled); ++ KMenuItemSeparator *insertSeparator(int id, const QString& text, int nIndex); ++ KMenuItemHeader *insertHeader(int id, const QString &relpath); ++ KMenuItem* insertMenuItem(KService::Ptr & s, int nId, int nIndex = -1, KMenuItem* parentItem = 0, ++ const QString &aliasname = QString::null, const QString &label = QString::null, ++ const QString &categoryIcon = QString::null); ++ KMenuItem* insertRecentlyItem(const QString& s, int nId, int nIndex = -1); ++ KMenuItem* insertDocumentItem(const QString& s, int nId, int nIndex = -1 , const QStringList* suppressGenericNames = 0, ++ const QString& aliasname = QString::null); ++ KMenuItem* insertSubItem(const QString& icon, const QString& caption, const QString& description, const QString& path, KMenuItem* parentItem); ++ KMenuItem* findItem(int nId); ++ ++ void setIconSize(int size) { m_iconSize = size; } ++ void setMouseMoveSelects(bool select) { m_mouseMoveSelects = select; } ++ void clear(); ++ int goodHeight(); ++ QString path; ++ void setBackPath( const QString &str ) { m_back_url = str; } ++ QString backPath() const { return m_back_url; } ++ ++public slots: ++ void slotItemClicked(QListViewItem*); ++ void slotMoveContent(); ++ ++signals: ++ void startService(KService::Ptr kservice); ++ void startURL(const QString& u); ++ ++protected: ++ void contentsMouseMoveEvent(QMouseEvent *e); ++ void contentsMousePressEvent ( QMouseEvent * e ); ++ void contentsWheelEvent(QWheelEvent *e); ++ void leaveEvent(QEvent *e); ++ virtual void resizeEvent ( QResizeEvent * e ); ++ virtual void viewportPaintEvent ( QPaintEvent * pe ); ++ virtual QDragObject* dragObject (); ++ virtual bool acceptDrag (QDropEvent* event) const; ++ virtual bool focusNextPrevChild(bool next); ++ ++private slots: ++ void slotItemClicked(int button, QListViewItem * item, const QPoint & pos, int c ); ++ ++private: ++ KMenuItem* itemAtIndex(int nIndex); ++ void moveItemToIndex(KMenuItem*, int); ++ ++ QWidget* m_itemBox; ++ QVBoxLayout* m_itemLayout; ++ KMenuItem *m_lastOne; ++ KMenuSpacer *m_spacer; ++ ++ QString m_back_url; ++ ++ bool m_mouseMoveSelects; ++ int m_iconSize; ++ int m_old_contentY; ++}; ++ ++class FavoritesItemView : public ItemView ++{ ++public: ++ FavoritesItemView(QWidget* parent, const char* name = 0); ++ ++protected: ++ virtual bool acceptDrag (QDropEvent* event) const; ++}; ++ ++class KMenuItemInfo ++{ ++public: ++ int m_id; ++ KService::Ptr m_s; ++ QString m_title; ++ QString m_description; ++ QString m_path; ++ QString m_icon; ++}; ++ ++class KMenuItemDrag : public QDragObject ++{ ++ public: ++ KMenuItemDrag(KMenuItem& item, QWidget *dragSource); ++ ~KMenuItemDrag(); ++ ++ virtual const char * format(int i = 0) const; ++ virtual QByteArray encodedData(const char *) const; ++ ++ static bool canDecode(const QMimeSource * e); ++ static bool decode(const QMimeSource* e, KMenuItemInfo& item); ++ ++ private: ++ QByteArray a; ++}; ++ ++#endif +--- kicker/ui/default-favs (Revision 0) ++++ kicker/ui/default-favs (Revision 849791) +@@ -0,0 +1,9 @@ ++MozillaFirefox.desktop ++kde-Kontact.desktop ++writer.desktop ++kde-amarok.desktop ++kde-digikam.desktop ++kde-Home.desktop ++kde-KControl.desktop ++kde-Help.desktop ++kde-konsole.desktop +--- kicker/ui/query.h (Revision 0) ++++ kicker/ui/query.h (Revision 849791) +@@ -0,0 +1,55 @@ ++/***************************************************************** ++ ++ Copyright (c) 2006 Stephan Binner <binner@kde.org> ++ ++ 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; see the file COPYING. If not, write to ++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++ Boston, MA 02110-1301, USA. ++ ++******************************************************************/ ++ ++#ifndef QUERY_H ++#define QUERY_H ++ ++#include <qstringlist.h> ++#include <qptrlist.h> ++ ++class Alternative ++{ ++public: ++ QStringList includes; ++ QStringList excludes; ++}; ++ ++class Query ++{ ++ public: ++ Query(); ++ void clear(); ++ void set(const QString &); ++ QString get() const; ++ bool matches(const QString &); ++ ++ private: ++ QString query_term; ++ QPtrList<Alternative> alternatives; ++ ++ void add_term(); ++ QString current_part; ++ Alternative *current_alternative; ++ bool within_quotes; ++ bool exclude_part; ++}; ++ ++#endif +--- kicker/ui/k_mnu_stub.h (Revision 0) ++++ kicker/ui/k_mnu_stub.h (Revision 849791) +@@ -0,0 +1,72 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Dirk Mueller <mueller@kde.org> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#ifndef __k_mnu_stub_h__ ++#define __k_mnu_stub_h__ ++ ++#include <qstring.h> ++#include <qpoint.h> ++ ++class KickerClientMenu; ++class KMenu; ++class PanelKMenu; ++ ++ ++ ++ ++class KMenuStub ++{ ++public: ++ KMenuStub(KMenu* _kmenu) ++ : m_type(t_KMenu) { m_w.kmenu = _kmenu; } ++ KMenuStub(PanelKMenu* _panelkmenu) ++ : m_type(t_PanelKMenu) { m_w.panelkmenu = _panelkmenu; } ++ ~KMenuStub() {} ++ ++ void removeClientMenu(int id); ++ int insertClientMenu(KickerClientMenu *p); ++ void adjustSize(); ++ void hide(); ++ void show(); ++ void showMenu(); ++ void resize(); ++ void popup(const QPoint &pos, int indexAtPoint = -1); ++ void selectFirstItem(); ++ void resize(int, int); ++ QSize sizeHint() const; ++ bool highlightMenuItem( const QString &menuId ); ++ void clearRecentMenuItems(); ++ void initialize(); ++ ++ QWidget* widget(); ++ ++ bool isVisible() const; ++private: ++ enum {t_PanelKMenu, t_KMenu} m_type; ++ union { ++ KMenu* kmenu; ++ PanelKMenu* panelkmenu; ++ } m_w; ++}; ++ ++#endif +--- kicker/ui/Makefile.am (Revision 849788) ++++ kicker/ui/Makefile.am (Revision 849791) +@@ -1,38 +1,46 @@ + INCLUDES = -I$(srcdir)/../core -I../core -I$(srcdir)/../buttons \ + -I../../libkicker -I$(srcdir)/../../libkicker \ +- -I$(top_srcdir)/libkonq -I$(top_srcdir)/kdmlib $(all_includes) ++ -I$(top_srcdir)/libkonq -I$(top_srcdir)/kdmlib $(DBUS_INCS) $(all_includes) + + noinst_LTLIBRARIES = libkicker_ui.la + ++libkicker_ui_la_COMPILE_FIRST = kmenubase.h ++ + libkicker_ui_la_SOURCES = addbutton_mnu.cpp appletitem.ui appletview.ui addapplet.cpp \ + addapplet_mnu.cpp appletop_mnu.cpp \ + browser_mnu.cpp client_mnu.cpp dirdrop_mnu.cpp \ +- nonKDEButtonSettings.ui exe_dlg.cpp k_mnu.cpp k_mnu.skel\ +- quickbrowser_mnu.cpp service_mnu.cpp \ +- addextension_mnu.cpp extensionop_mnu.cpp \ +- recentapps.cpp browser_dlg.cpp \ ++ nonKDEButtonSettings.ui exe_dlg.cpp k_new_mnu.cpp k_mnu.cpp k_mnu.skel\ ++ quickbrowser_mnu.cpp service_mnu.cpp kmenubase.ui kmenuitembase.ui \ ++ addextension_mnu.cpp extensionop_mnu.cpp k_mnu_stub.cpp \ ++ recentapps.cpp browser_dlg.cpp itemview.cpp kickoff_bar.cpp \ + removeapplet_mnu.cpp removeextension_mnu.cpp removecontainer_mnu.cpp \ + removebutton_mnu.cpp popupmenutitle.cpp hidebutton.cpp \ +- addappletvisualfeedback.cpp ++ addappletvisualfeedback.cpp flipscrollview.cpp \ ++ media_watcher.cpp media_watcher.skel mykickoffsearchinterface.cpp query.cpp + +-libkicker_ui_la_LIBADD = $(top_builddir)/libkonq/libkonq.la $(top_builddir)/kdmlib/libdmctl.la ++libkicker_ui_la_LIBADD = $(top_builddir)/libkonq/libkonq.la $(top_builddir)/kdmlib/libdmctl.la \ ++ $(LIB_KABC) ../interfaces/libkickoffsearch_interfaces.la -llazy + + libkicker_ui_la_METASOURCES = AUTO + + noinst_HEADERS = addapplet.h appletwidget.h addbutton_mnu.h addapplet_mnu.h appletop_mnu.h \ +- browser_mnu.h client_mnu.h dirdrop_mnu.h exe_dlg.h k_mnu.h \ ++ browser_mnu.h client_mnu.h dirdrop_mnu.h exe_dlg.h k_new_mnu.h k_mnu.h \ + quickbrowser_mnu.h service_mnu.h \ + addextension_mnu.h extensionop_mnu.h \ +- recentapps.h browser_dlg.h \ ++ recentapps.h browser_dlg.h itemview.h query.h \ + removeapplet_mnu.h removeextension_mnu.h removecontainer_mnu.h \ + removebutton_mnu.h popupmenutitle.h hidebutton.h addappletvisualfeedback.h + ++kicker_ui_data_DATA = default-favs ++kicker_ui_datadir = $(kde_datadir)/kicker ++ + removecontainer_mnu.lo: ../../libkicker/kickerSettings.h + removeextension_mnu.lo: ../../libkicker/kickerSettings.h + addextension_mnu.lo: ../core/extensionSettings.h + appletop_mnu.lo: ../../libkicker/kickerSettings.h + extensionop_mnu.lo: ../../libkicker/kickerSettings.h + k_mnu.lo: ../../libkicker/kickerSettings.h ++k_new_mnu.lo: ../../libkicker/kickerSettings.h + removecontainer_mnu.lo: ../core/extensionSettings.h + removeextension_mnu.lo: ../core/extensionSettings.h + service_mnu.lo: ../../libkicker/kickerSettings.h +--- kicker/ui/mykickoffsearchinterface.cpp (Revision 0) ++++ kicker/ui/mykickoffsearchinterface.cpp (Revision 849791) +@@ -0,0 +1,54 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Stephan Binner <binner@kde.org> * ++ * * ++ * 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 "mykickoffsearchinterface.h" ++#include "../ui/k_new_mnu.h" ++ ++MyKickoffSearchInterface::MyKickoffSearchInterface( KMenu* menu, QObject* parent, const char* name ) ++ : KickoffSearchInterface( parent, name ), _menu( menu ) ++{ ++} ++ ++bool MyKickoffSearchInterface::anotherHitMenuItemAllowed(int cat) ++{ ++ return _menu->anotherHitMenuItemAllowed(cat); ++} ++ ++void MyKickoffSearchInterface::addHitMenuItem(HitMenuItem* item) ++{ ++ _menu->addHitMenuItem(item); ++} ++ ++ ++void MyKickoffSearchInterface::searchOver() ++{ ++ _menu->searchOver(); ++} ++ ++void MyKickoffSearchInterface::initCategoryTitlesUpdate() ++{ ++ _menu->initCategoryTitlesUpdate(); ++} ++ ++void MyKickoffSearchInterface::updateCategoryTitles() ++{ ++ _menu->updateCategoryTitles(); ++} ++ ++#include "mykickoffsearchinterface.moc" +--- kicker/ui/itemview.cpp (Revision 0) ++++ kicker/ui/itemview.cpp (Revision 849791) +@@ -0,0 +1,1257 @@ ++/***************************************************************** ++ ++Copyright (c) 1996-2000 the kicker authors. See file AUTHORS. ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#include <stdlib.h> ++#include <sys/types.h> ++#include <unistd.h> ++#include <dmctl.h> ++ ++#include <qapplication.h> ++#include <qimage.h> ++#include <qpainter.h> ++#include <qstyle.h> ++#include <qwidgetstack.h> ++#include <qlayout.h> ++#include <qlabel.h> ++#include <qvbox.h> ++#include <qheader.h> ++#include <qdrawutil.h> ++#include <qdragobject.h> ++#include <qcursor.h> ++#include <qpaintdevicemetrics.h> ++#include <qbuffer.h> ++#include <qtooltip.h> ++#include <qstylesheet.h> ++#include <qiconview.h> ++ ++#include <dcopclient.h> ++#include <kapplication.h> ++#include <kaboutkde.h> ++#include <kpixmapeffect.h> ++#include <kaction.h> ++#include <kbookmarkmenu.h> ++#include <kconfig.h> ++#include <kdebug.h> ++#include <kglobal.h> ++#include <kglobalsettings.h> ++#include <kiconloader.h> ++#include <klocale.h> ++#include <kmessagebox.h> ++#include <kstandarddirs.h> ++#include <kcombobox.h> ++#include <kwin.h> ++#include <kdebug.h> ++#include <kmimetype.h> ++#include <kmultipledrag.h> ++ ++#include "client_mnu.h" ++#include "container_base.h" ++#include "global.h" ++#include "kbutton.h" ++#include "kicker.h" ++#include "kickerSettings.h" ++#include "konqbookmarkmanager.h" ++#include "menuinfo.h" ++#include "menumanager.h" ++#include "popupmenutitle.h" ++#include "quickbrowser_mnu.h" ++#include "recentapps.h" ++ ++#include "k_mnu.h" ++#include "k_new_mnu.h" ++#include "itemview.h" ++ ++// -------------------------------------------------------------------------- ++ ++KMenuItem::~KMenuItem() ++{ ++ ItemView *listview = dynamic_cast<ItemView*>( listView() ); ++ if ( listview && listview->m_lastOne == this) { ++ listview->m_lastOne = 0; ++ listview->m_old_contentY = -1; ++ } ++} ++ ++static double pointSize( double pixelSize, QPaintDevice *w ) ++{ ++ return pixelSize * 72. / QPaintDevice::x11AppDpiY( w->x11Screen () ); ++} ++ ++static int pixelSize( double pixelSize, QPaintDevice *w ) ++{ ++ return qRound( pixelSize * QPaintDevice::x11AppDpiY( w->x11Screen () ) / 72. ); ++} ++ ++void KMenuItem::init() ++{ ++ setMultiLinesEnabled(true); ++ m_s = 0; ++ m_path = QString::null; ++ m_icon = QString::null; ++ m_menuPath = QString::null; ++ setDragEnabled(true); ++ m_has_children = false; ++ m_old_width = -1; ++ if ( QApplication::reverseLayout() ) ++ right_triangle.load( locate( "data", "kicker/pics/left_triangle.png" ) ); ++ else ++ right_triangle.load( locate( "data", "kicker/pics/right_triangle.png" ) ); ++} ++ ++void KMenuItem::setTitle(const QString& txt) ++{ ++ m_title = txt; ++ setText( 0, txt ); ++ setup(); ++} ++ ++void KMenuItem::setToolTip(const QString& txt) ++{ ++ m_tooltip = txt; ++} ++ ++void KMenuItem::setDescription(const QString& txt) ++{ ++ m_description = txt; ++ setup(); ++} ++ ++void KMenuItem::setIcon(const QString& icon, int size) ++{ ++ m_icon = icon; ++ QListViewItem::setPixmap(0, KGlobal::iconLoader()->loadIcon(icon, KIcon::Panel, size )); ++} ++ ++void KMenuItem::setHasChildren( bool flag ) ++{ ++ m_has_children = flag; ++ repaint(); ++} ++ ++void KMenuItem::setup() ++{ ++ // if someone configured a larger generalFont than 10pt, he might have a _real_ problem with 7pt ++ // the 7pt could be read out of konquerorrc I guess ++ float min_font_size = 7. * QMAX(1., KGlobalSettings::generalFont().pointSizeFloat() / 10.); ++ ++ const int expected_height = 38; ++ description_font_size = QMAX( pointSize( expected_height * .3, listView() ) + KickerSettings::kickoffFontPointSizeOffset(), min_font_size ) ; ++ title_font_size = QMAX( pointSize( expected_height * .25, listView() ) + KickerSettings::kickoffFontPointSizeOffset(), min_font_size + 1 ); ++ ++ //kdDebug() << description_font_size << " " << title_font_size << " " << pointSize( expected_height * .25, listView() ) << endl; ++ QListViewItem::setup(); ++ setHeight( (int)QMAX( expected_height, pixelSize( title_font_size + description_font_size * 2.3, listView()))); ++} ++ ++void KMenuItem::paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align) ++{ ++ ItemView *listview = static_cast<ItemView*>( listView() ); ++ int bottom = listView()->itemRect( this ).bottom(); ++ int diff = bottom - listView()->viewport()->height(); ++ ++ KPixmap pm; ++ pm.resize( width, height() ); ++ QPainter pp( &pm ); ++ paintCellInter( &pp, cg, column, width, align ); ++ pp.end(); ++ ++ if ( diff > 0 && diff <= height() ) // cut off ++ { ++ pm.resize( width, height() - diff ); ++ KPixmapEffect::blend( pm, float( diff ) / height(), ++ cg.color( QColorGroup::Background ), ++ KPixmapEffect::VerticalGradient ); ++ p->drawPixmap( 0, 0, pm ); ++ if ( listview->m_lastOne != this ) ++ { ++ listview->m_lastOne = this; ++ listview->m_old_contentY = -1; ++ } ++ } ++ else ++ { ++ p->drawPixmap( 0, 0, pm ); ++ if ( this == listview->m_lastOne ) { ++ if ( bottom < 0 ) ++ listview->m_lastOne = static_cast<KMenuItem*>( itemAbove() ); ++ else ++ listview->m_lastOne = static_cast<KMenuItem*>( itemBelow() ); ++ listview->m_old_contentY = -1; ++ repaint(); ++ } ++ } ++} ++ ++void KMenuItem::makeGradient( KPixmap &off, const QColor &c ) ++{ ++ KPixmap blend; ++ blend.resize( off.width() / 3, off.height() ); ++ bitBlt( &blend, 0, 0, &off, off.width() - blend.width(), 0, blend.width(), blend.height() ); ++ KPixmapEffect::blend( blend, 0.2, c, KPixmapEffect::HorizontalGradient ); ++ QPainter p( &off ); ++ p.drawPixmap( off.width() - blend.width(), 0, blend ); ++ p.end(); ++} ++ ++void KMenuItem::paintCellInter(QPainter* p, const QColorGroup & cg, int column, int width, int align) ++{ ++ const bool reverseLayout = QApplication::reverseLayout(); ++ ++ const BackgroundMode bgmode = listView()->viewport()->backgroundMode(); ++ const QColorGroup::ColorRole crole = QPalette::backgroundRoleFromMode( bgmode ); ++ QColor backg = cg.color( crole ); ++ ++ if ( isSelected() ) ++ backg = cg.color( QColorGroup::Highlight ); ++ p->fillRect( 0, 0, width, height(), backg ); ++ ++ QFontMetrics fm( p->fontMetrics() ); ++ ++ int pixsize = 32; ++ if ( height() < 36 ) ++ pixsize = 16; ++ const int left_margin = 30; ++ const int margin = 3; ++ ++// p->drawText( 2, 2, left_margin - 2, height(), align, QString::number( childCount () ) ); ++ ++ const QPixmap * pix = pixmap( column ); ++ ++ if ( pix ) ++ { ++ QPixmap pix32 = *pix; ++ ++ if ( pix->width() > pixsize ) ++ { ++ QImage i = pix->convertToImage().smoothScale( pixsize, pixsize ); ++ pix32.convertFromImage( i ); ++ } ++ if ( reverseLayout ) ++ p->drawPixmap( width - ( (pixsize - pix32.width()) / 2 + left_margin ) - pix32.width(), ++ ( height() - pix32.height() ) / 2, pix32 ); ++ else ++ p->drawPixmap( (pixsize - pix32.width()) / 2 + left_margin, ++ ( height() - pix32.height() ) / 2, pix32 ); ++ } ++ ++ if ( m_title.isEmpty() ) ++ return; ++ ++ int r = left_margin + pixsize + margin * 2; ++ ++ QFont f1 = p->font(); ++ f1.setPointSizeFloat( title_font_size ); ++ f1.setWeight( QFont::Normal ); // QFont::DemiBold == 63 ++ ++ QFont f2 = p->font(); ++ f2.setPointSizeFloat( description_font_size ); ++ f2.setWeight( QFont::Light ); ++ ++ int f1h = QFontMetrics( f1 ).height(); ++ int f2h = QFontMetrics( f2 ).height(); ++ ++ const int text_margin = 2; ++ int spacing = ( height() - f1h - f2h - text_margin ) / 2; ++ if ( m_description.isEmpty() ) ++ spacing = ( height() - f1h ) / 2; ++ ++ int right_triangle_size = pixelSize( 7, listView() ); ++ ++ int right_margin = listView()->verticalScrollBar()->width(); ++ if ( m_has_children ) ++ right_margin += right_triangle_size * 2; ++ ++ KPixmap off; ++ QPainter pp; ++ ++ off.resize( width-text_margin-r-right_margin, height() ); ++ pp.begin( &off ); ++ pp.fillRect( 0, 0, off.width(), off.height(), backg ); ++ ++ if (isSelected()) ++ pp.setPen( cg.color( QColorGroup::HighlightedText ) ); ++ else ++ pp.setPen( cg.color( QColorGroup::Text ) ); ++ ++ pp.setFont( f1 ); ++ pp.drawText( 0, 0, off.width(), off.height(), align, m_title ); ++ pp.end(); ++ if ( QFontMetrics( f1 ).width( m_title ) > off.width() ) ++ { ++ makeGradient( off, backg ); ++ if ( !m_description.isEmpty() ) ++ setToolTip( m_title + "<br><br>" + m_description ); ++ else ++ setToolTip( m_title ); ++ } ++ if ( reverseLayout ) ++ p->drawPixmap( width - off.width() - r, spacing, off ); ++ else ++ p->drawPixmap( r, spacing, off ); ++ ++ if ( !m_description.isEmpty() ) ++ { ++ pp.begin( &off ); ++ pp.fillRect( 0, 0, off.width(), off.height(), backg ); ++ ++ QColor myColor = cg.color( QColorGroup::Text ).light( 200 ); ++ if ( qGray( myColor.rgb() ) == 0 ) ++ myColor = QColor( 100, 100, 110 ); ++ pp.setPen( myColor ); ++ pp.setPen( isSelected() ? cg.color( QColorGroup::Mid ) : myColor ); ++ pp.setFont( f2 ); ++ pp.drawText( 0, 0, off.width(), off.height(), align, m_description ); ++ pp.end(); ++ if ( QFontMetrics( f2 ).width( m_description ) > off.width() ) ++ { ++ makeGradient( off, backg ); ++ setToolTip( m_title + "<br><br>" + m_description ); ++ } ++ if ( reverseLayout ) ++ p->drawPixmap( width - off.width() - r, spacing + text_margin + f1h, off ); ++ else ++ p->drawPixmap( r, spacing + text_margin + f1h, off ); ++ } ++ ++ if ( m_has_children ) ++ { ++ QImage i = right_triangle.convertToImage().smoothScale( right_triangle_size, ++ right_triangle_size ); ++ QPixmap tri; ++ tri.convertFromImage( i ); ++ ++ if ( reverseLayout ) ++ p->drawPixmap( right_margin - tri.width(), ( height() - f1h ) / 2, tri ); ++ else ++ p->drawPixmap( listView()->width() - right_margin, ( height() - f1h ) / 2, tri ); ++ } ++ ++ if ( m_old_width != width ) ++ { ++ // the listview caches paint events ++ m_old_width = width; ++ repaint(); ++ } ++} ++ ++// -------------------------------------------------------------------------- ++ ++KMenuItemSeparator::KMenuItemSeparator(int nId, QListView* parent) ++ : KMenuItem(nId, parent), lv(parent), cached_width( 0 ) ++{ ++ setEnabled(false); ++ left_margin = 15; ++} ++ ++void KMenuItemSeparator::setup() ++{ ++ KMenuItem::setup(); ++ ++ QFont f = QFont(); ++ QFontMetrics fm(f); ++ f.setPointSize( 8 + KickerSettings::kickoffFontPointSizeOffset() ); ++ if ( itemAbove() && !text( 0 ).isEmpty() ) ++ setHeight( (int)QMAX( 34., fm.height() * 1.4) ); ++ else ++ setHeight( (int)QMAX( 26., fm.height() * 1.4 ) ); ++} ++ ++void KMenuItemSeparator::setLink( const QString &text, const QString &url ) ++{ ++ m_link_text = text; ++ m_link_url = url; ++ m_link_rect = QRect(); ++} ++ ++bool KMenuItemSeparator::hitsLink( const QPoint &pos ) ++{ ++ return m_link_rect.contains( pos ); ++} ++ ++void KMenuItemSeparator::preparePixmap( int width ) ++{ ++ if ( cached_width != width ) ++ { ++ pixmap.load( locate("data", "kicker/pics/menu_separator.png" ) ); ++ QImage i = pixmap.convertToImage().smoothScale( width - 15 - left_margin, pixmap.height() ); ++ pixmap.convertFromImage( i ); ++ cached_width = width; ++ } ++} ++ ++void KMenuItemSeparator::paintCell(QPainter* p, const QColorGroup & cg, int column, int width, int align) ++{ ++ preparePixmap(width); ++ ++ const int h = height(); ++ ++ if (text(0).isEmpty()) { ++ KMenuItem::paintCell(p, cg, column, width, align); ++ p->drawPixmap( 15 , h/2, pixmap ); ++ } ++ else { ++ const BackgroundMode bgmode = lv->viewport()->backgroundMode(); ++ const QColorGroup::ColorRole crole = QPalette::backgroundRoleFromMode( bgmode ); ++ p->fillRect( 0, 0, width, h, cg.brush( crole ) ); ++ ++ int margin = 0; ++ if ( itemAbove() ) { ++ p->drawPixmap( 15 , h/4, pixmap ); ++ margin = h / 4; ++ } ++ QFont f = listView()->font(); ++ f.setWeight( QFont::Normal ); ++ f.setPointSize( 8 + KickerSettings::kickoffFontPointSizeOffset() ); ++ p->setFont( f ); ++ QColor myColor = cg.color( QColorGroup::Text ).light( 200 ); ++ if ( qGray( myColor.rgb() ) == 0 ) ++ myColor = QColor( 100, 100, 110 ); ++ p->setPen( myColor ); ++ int twidth = p->fontMetrics().width(text(0)); ++ int lwidth = 0; ++ int swidth = 0; ++ int fwidth = 0; ++ ++ if ( !m_link_text.isEmpty() ) ++ { ++ swidth = p->fontMetrics().width( " (" ); ++ lwidth = p->fontMetrics().width(m_link_text ); ++ fwidth = p->fontMetrics().width( ")" ); ++ } ++ int pos = int(lv->width() * 0.9 - twidth - swidth - lwidth - fwidth); ++ p->drawText( pos, margin + 5, ++ width, h - ( margin +5 ), AlignTop, text(0) ); ++ if ( !m_link_text.isEmpty() ) ++ { ++ pos += twidth; ++ p->drawText( pos, margin + 5, ++ width, h - ( margin +5 ), AlignTop, " (" ); ++ pos += swidth; ++ p->setPen( cg.color( QColorGroup::Link ) ); ++ f.setUnderline( true ); ++ p->setFont( f ); ++ p->drawText( pos, margin + 5, ++ width, h - ( margin +5 ), AlignTop, m_link_text ); ++ m_link_rect = QRect( pos, margin + 5, lwidth, p->fontMetrics().height() ); ++ pos += lwidth; ++ f.setUnderline( false ); ++ p->setFont( f ); ++ p->drawText( pos, margin + 5, ++ width, h - ( margin +5 ), AlignTop, ")" ); ++ } ++ } ++} ++ ++KMenuItemHeader::KMenuItemHeader(int nId, const QString& relPath, QListView* parent) ++ : KMenuItemSeparator(nId, parent) ++{ ++ setEnabled( false ); ++ QString path; ++ if (relPath.startsWith( "new/" /*"kicker:/new/"*/ )) { ++ paths.append( "kicker:/goup/" ); ++ texts.append( i18n("New Applications") ); ++ icons.append( "clock" ); ++ } ++ else if (relPath == "kicker:/restart/") { ++ texts.append( i18n("Restart Computer") ); ++ } ++ else if (relPath == "kicker:/switchuser/") { ++ texts.append( i18n("Switch User") ); ++ } ++ else { ++ KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(relPath); ++ QStringList items = QStringList::split( '/', relPath ); ++ for ( QStringList::ConstIterator it = items.begin(); it != items.end(); ++it ) ++ { ++ path += *it + "/"; ++ paths.append( "kicker:/goup/" + path ); ++ KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(path); ++ QString groupCaption = subMenuRoot->caption(); ++ texts.append( groupCaption ); ++ icons.append( subMenuRoot->icon() ); ++ } ++ } ++ ++ setPath( "kicker:/goup/" + path ); // the last wins for now ++ left_margin = 10; ++} ++ ++void KMenuItemHeader::setup() ++{ ++ KMenuItem::setup(); ++ ++ QFontMetrics fm( listView()->font() ); ++ setHeight( QMAX( int( texts.count() * fm.height() + ( texts.count() + 1 ) * 2 + 10 ), height()) ); ++ // nada ++} ++ ++void KMenuItemHeader::paintCell(QPainter* p, const QColorGroup & cg, int , int width, int align ) ++{ ++ preparePixmap(width); ++ ++ const BackgroundMode bgmode = listView()->viewport()->backgroundMode(); ++ const QColorGroup::ColorRole crole = QPalette::backgroundRoleFromMode( bgmode ); ++ ++ QBrush br = cg.brush( crole ); ++ if ( isSelected() ) { ++ br = cg.brush( QColorGroup::Highlight ); ++ p->fillRect( 0, 0, width, height() - 3, br ); ++ } else { ++ p->fillRect( 0, 0, width, height(), br ); ++ } ++ ++ QFontMetrics fm( p->fontMetrics() ); ++ const int left_margin = 10; ++ ++ const int margin = 3; ++ ++ int r = left_margin + margin * 2; ++ ++ const int min_font_size = 7; ++ int title_font_pixelSize = qRound( pixelSize( QMAX( pointSize( 12, listView() ) + KickerSettings::kickoffFontPointSizeOffset(), min_font_size + 1 ), listView() ) ); ++ ++ QFont f1 = p->font(); ++ f1.setPixelSize( title_font_pixelSize ); ++ p->setFont( f1 ); ++ int f1h = QFontMetrics( f1 ).height(); ++ ++ p->setPen( cg.color( QColorGroup::Text ) ); ++ ++ const int text_margin = 2; ++ int spacing = ( height() - texts.count() * f1h - QMAX( texts.count() - 1, 0 ) * text_margin ) / 2; ++ ++ for ( uint i = 0; i < texts.count(); ++i ) ++ { ++ if (i==texts.count()-1) { ++ f1.setWeight( QFont::DemiBold ); ++ p->setFont( f1 ); ++ f1h = QFontMetrics( f1 ).height(); ++ } ++ ++ p->drawText( r, spacing, width-text_margin-r, height(), align, texts[i] ); ++ spacing += text_margin + f1h; ++ r += title_font_pixelSize; ++ } ++ ++ p->drawPixmap( left_margin , height() - 2, pixmap ); ++} ++ ++KMenuSpacer::KMenuSpacer(int nId, QListView* parent) ++ : KMenuItem(nId, parent) ++{ ++ setEnabled(false); ++} ++ ++void KMenuSpacer::setup() ++{ ++ // nada ++} ++ ++void KMenuSpacer::paintCell(QPainter* p, const QColorGroup & cg, int , int width, int ) ++{ ++ const BackgroundMode bgmode = listView()->viewport()->backgroundMode(); ++ const QColorGroup::ColorRole crole = QPalette::backgroundRoleFromMode( bgmode ); ++ QBrush br = cg.brush( crole ); ++ ++ p->fillRect( 0, 0, width, height(), br ); ++} ++ ++void KMenuSpacer::setHeight( int i ) ++{ ++ KMenuItem::setHeight( i ); ++} ++ ++class ItemViewTip : public QToolTip ++{ ++public: ++ ItemViewTip( QWidget *parent, QListView *lv ); ++ ++ void maybeTip( const QPoint &pos ); ++ ++private: ++ QListView *view; ++ ++}; ++ ++ItemViewTip::ItemViewTip( QWidget *parent, QListView *lv ) ++ : QToolTip( parent ), view( lv ) ++{ ++} ++ ++void ItemViewTip::maybeTip( const QPoint &pos ) ++{ ++ KMenuItem *item = dynamic_cast<KMenuItem*>( view->itemAt( pos ) ); ++ QPoint contentsPos = view->viewportToContents( pos ); ++ if ( !item ) ++ return; ++ ++ if ( item->toolTip().isNull() ) ++ return; ++ ++ QRect r = view->itemRect( item ); ++ int headerPos = view->header()->sectionPos( 0 ); ++ r.setLeft( headerPos ); ++ r.setRight( headerPos + view->header()->sectionSize( 0 ) ); ++ tip( r, item->toolTip() ); ++} ++ ++// -------------------------------------------------------------------------- ++ ++ItemView::ItemView(QWidget* parent, const char* name) ++ : KListView(parent, name), m_spacer( 0 ), ++ m_mouseMoveSelects(true), m_iconSize(32) ++{ ++ setHScrollBarMode( QScrollView::AlwaysOff ); ++ setFrameStyle( QFrame::NoFrame ); ++ setSelectionMode(QListView::Single); ++ addColumn(""); ++ header()->setStretchEnabled(1, 0); ++ //setColumnWidthMode(0, QListView::Maximum); ++ header()->hide(); ++ setMouseTracking(true); ++ setItemMargin(0); ++ setSorting(-1); ++ setTreeStepSize(38); ++ setFocusPolicy(QWidget::NoFocus); ++ ++ m_lastOne = 0; ++ m_old_contentY = -1; ++ ++ connect(this, SIGNAL(mouseButtonClicked( int, QListViewItem*, const QPoint &, int )), ++ SLOT(slotItemClicked(int, QListViewItem*, const QPoint &, int))); ++ ++ connect(this, SIGNAL(returnPressed(QListViewItem*)), SLOT(slotItemClicked(QListViewItem*))); ++ connect(this, SIGNAL(spacePressed(QListViewItem*)), SLOT(slotItemClicked(QListViewItem*))); ++ ++ new ItemViewTip( viewport(), this ); ++} ++ ++KMenuItemHeader *ItemView::insertHeader(int id, const QString &relpath) ++{ ++ KMenuItemHeader *newItem = new KMenuItemHeader(id, relpath, this ); ++ moveItemToIndex(newItem, 1); ++ setBackPath( "kicker:/goup/" + relpath ); // the last wins for now ++ ++ return newItem; ++} ++ ++KMenuItem* ItemView::findItem(int nId) ++{ ++ for (QListViewItemIterator it(this); it.current(); ++it) ++ { ++ if(static_cast<KMenuItem*>(it.current())->id() == nId) ++ return static_cast<KMenuItem*>(it.current()); ++ } ++ ++ return 0L; ++} ++ ++bool ItemView::focusNextPrevChild(bool /*next*/) ++{ ++ return false; ++} ++ ++KMenuItem* ItemView::itemAtIndex(int nIndex) ++{ ++ if(nIndex <= 0) ++ return 0L; ++ ++ if(nIndex >= childCount()) ++ return static_cast<KMenuItem*>(lastItem()); ++ ++ int i = 1; ++ QListViewItemIterator it(this); ++ for (;it.current(); ++i, ++it) { ++ if(i == nIndex) ++ return static_cast<KMenuItem*>(it.current()); ++ } ++ ++ return static_cast<KMenuItem*>(lastItem()); ++} ++ ++KMenuItem* ItemView::insertItem( const QString& icon, const QString& text, const QString& description, const ++ QString& path, int nId, int nIndex, KMenuItem *parent) ++{ ++ KMenuItem* newItem = findItem(nId); ++ ++ if(!newItem && parent) ++ newItem = new KMenuItem(nId, parent ); ++ else if ( !newItem ) ++ newItem = new KMenuItem(nId, this ); ++ ++ newItem->setIcon(icon, m_iconSize); ++ newItem->setTitle(text); ++ newItem->setDescription(description); ++ newItem->setPath(path); ++ ++ if (nIndex==-1) ++ nIndex=childCount(); ++ ++ moveItemToIndex(newItem, nIndex); ++ ++ return newItem; ++} ++ ++KMenuItem* ItemView::insertItem( const QString& icon, const QString& text, const QString& description, ++ int nId, int nIndex, KMenuItem *parent) ++{ ++ return insertItem( icon, text, description, QString::null, nId, nIndex, parent); ++} ++ ++int ItemView::setItemEnabled(int id, bool enabled) ++{ ++ KMenuItem* item = findItem(id); ++ ++ if(item) ++ item->setEnabled(enabled); ++ ++ return 0; ++} ++ ++KMenuItemSeparator *ItemView::insertSeparator(int nId, const QString& text, int nIndex) ++{ ++ KMenuItemSeparator *newItem = new KMenuItemSeparator(nId, this); ++ ++ newItem->setText(0, text); ++ ++ if (nIndex==-1) ++ nIndex=childCount(); ++ ++ moveItemToIndex(newItem, nIndex); ++ return newItem; ++} ++ ++void ItemView::moveItemToIndex(KMenuItem* item, int nIndex) ++{ ++ ++ if (nIndex <= 0) { ++ takeItem(item); ++ KListView::insertItem(item); ++ } ++ else { ++ item->moveItem(itemAtIndex(nIndex)); ++ } ++} ++ ++void ItemView::slotMoveContent() ++{ ++ if ( !m_spacer ) ++ return; ++ ++ int item_height = 0; ++ QListViewItemIterator it( this ); ++ while ( it.current() ) { ++ if ( !dynamic_cast<KMenuSpacer*>( it.current() ) && !it.current()->parent() && it.current()->isVisible() ) { ++ it.current()->invalidateHeight(); ++ item_height += it.current()->totalHeight(); ++ } ++ ++it; ++ } ++ ++ if ( height() > item_height ) ++ m_spacer->setHeight( height() - item_height ); ++ else ++ m_spacer->setHeight( 0 ); ++} ++ ++KMenuItem *ItemView::insertMenuItem(KService::Ptr& s, int nId, int nIndex, KMenuItem* parentItem, ++ const QString& aliasname, const QString & label, const QString & categoryIcon ) ++{ ++ if (!s) ++ return 0; ++ ++ QString serviceName = aliasname.isEmpty() ? s->name() : aliasname; ++ ++ kdDebug() << "insertMenuItem " << nId << " " << nIndex << " " << s->name() << endl; ++ KMenuItem* newItem = 0; //findItem(nId); ++ if(!newItem) ++ newItem = parentItem ? new KMenuItem(nId, parentItem) : new KMenuItem(nId, this); ++ ++ newItem->setIcon(s->icon()=="unknown" ? categoryIcon : s->icon(), m_iconSize); ++ if ((KickerSettings::DescriptionAndName || KickerSettings::menuEntryFormat() ++ == KickerSettings::DescriptionOnly) && !s->genericName().isEmpty()) { ++ newItem->setTitle(s->genericName()); ++ newItem->setDescription(label.isEmpty() ? serviceName : label); ++ } ++ else { ++ newItem->setTitle(label.isEmpty() ? serviceName : label); ++ newItem->setDescription(s->genericName()); ++ } ++ newItem->setService(s); ++ ++ if (nIndex==-2) ++ return newItem; ++ ++ if (nIndex==-1) ++ nIndex=childCount(); ++ ++ moveItemToIndex(newItem, nIndex); ++ ++ return newItem; ++} ++ ++KMenuItem* ItemView::insertDocumentItem(const QString& s, int nId, int nIndex, const QStringList* /*suppressGenericNames*/, ++ const QString& /*aliasname*/) ++{ ++ KMenuItem* newItem = findItem(nId); ++ ++ if(!newItem) ++ newItem = new KMenuItem(nId, this); ++ ++ KMimeType::Ptr mt = KMimeType::findByURL( s ); ++ newItem->setIcon(KMimeType::iconForURL( s ), m_iconSize); ++ newItem->setTitle(s); ++ newItem->setDescription(mt->comment()); ++ newItem->setPath(s); ++ ++ if (nIndex==-1) ++ nIndex=childCount(); ++ ++ moveItemToIndex(newItem, nIndex); ++ ++ return newItem; ++} ++ ++KMenuItem* ItemView::insertRecentlyItem(const QString& s, int nId, int nIndex) ++{ ++ KDesktopFile f(s, true /* read only */); ++ ++ KMenuItem* newItem = findItem(nId); ++ ++ if(!newItem) ++ newItem = new KMenuItem(nId, this); ++ ++ newItem->setIcon(f.readIcon(), m_iconSize); ++ ++ // work around upstream fixed bug ++ QString name=f.readName(); ++ if (name.isEmpty()) ++ name=f.readURL(); ++ ++ newItem->setTitle(name); ++ ++ QString comment = f.readComment(); ++ if (comment.isEmpty()) { ++ KURL url(f.readURL()); ++ if (!url.host().isEmpty()) ++ comment = i18n("Host: %1").arg(url.host()); ++ } ++ ++ newItem->setDescription(comment); ++ newItem->setPath(s); ++ ++ if (nIndex==-1) ++ nIndex=childCount(); ++ ++ moveItemToIndex(newItem, nIndex); ++ ++ return newItem; ++} ++ ++int ItemView::insertItem(PopupMenuTitle*, int, int) ++{ ++ return 0; ++} ++ ++KMenuItem* ItemView::insertSubItem(const QString& icon, const QString& caption, const QString& description, const QString& path, KMenuItem* parentItem) ++{ ++#warning FIXME ++ KMenuItem* newItem = parentItem ? new KMenuItem(-1, parentItem) : new KMenuItem(-1, this); ++ newItem->setTitle(caption); ++ newItem->setDescription(description); ++ newItem->setIcon(icon, m_iconSize); ++ newItem->setPath(path); ++ ++ return newItem; ++} ++ ++ ++ ++void ItemView::slotItemClicked(int button, QListViewItem * item, const QPoint & /*pos*/, int /*c*/ ) ++{ ++ if (button==1) ++ slotItemClicked(item); ++} ++ ++void ItemView::slotItemClicked(QListViewItem* item) ++{ ++ KMenuItem* kitem = dynamic_cast<KMenuItem*>(item); ++ if ( !kitem ) ++ return; ++ ++ if(kitem->service()) { ++ emit startService(kitem->service()); ++ } ++ else if(!kitem->path().isEmpty()) { ++ emit startURL(kitem->path()); ++ } ++} ++ ++void ItemView::contentsMousePressEvent ( QMouseEvent * e ) ++{ ++ KListView::contentsMousePressEvent( e ); ++ ++ QPoint vp = contentsToViewport(e->pos()); ++ KMenuItemSeparator *si = dynamic_cast<KMenuItemSeparator*>( itemAt( vp ) ); ++ if ( si ) ++ { ++ if ( si->hitsLink( vp - itemRect(si).topLeft() ) ) ++ emit startURL( si->linkUrl() ); ++ } ++} ++ ++void ItemView::contentsMouseMoveEvent(QMouseEvent *e) ++{ ++ QPoint vp = contentsToViewport(e->pos()); ++ QListViewItem * i = itemAt( vp ); ++ ++ bool link_cursor = false; ++ KMenuItemSeparator *si = dynamic_cast<KMenuItemSeparator*>( i ); ++ if ( si ) ++ link_cursor = si->hitsLink( vp - itemRect(si).topLeft() ); ++ ++ if (i && !i->isSelectable() && !link_cursor) { ++ unsetCursor(); ++ viewport()->unsetCursor(); ++ return; ++ } ++ ++ KListView::contentsMouseMoveEvent(e); ++ ++ if (m_mouseMoveSelects) { ++ if(i && i->isEnabled() && !i->isSelected() && ++ // FIXME: This is wrong if you drag over the items. ++ (e->state() & (LeftButton|MidButton|RightButton)) == 0) ++ KListView::setSelected(i, true); ++ else if (!i && selectedItem()) ++ KListView::setSelected(selectedItem(), false); ++ } ++ ++ if ( link_cursor ) ++ setCursor( Qt::PointingHandCursor ); ++ else ++ unsetCursor(); ++ ++} ++ ++void ItemView::leaveEvent(QEvent* e) ++{ ++ KListView::leaveEvent(e); ++ ++ clearSelection(); ++} ++ ++void ItemView::resizeEvent ( QResizeEvent * e ) ++{ ++ KListView::resizeEvent( e ); ++// if ( m_lastOne ) ++// int diff = itemRect( m_lastOne ).bottom() - viewport()->height(); ++} ++ ++void ItemView::viewportPaintEvent ( QPaintEvent * pe ) ++{ ++ //kdDebug() << "viewportPaintEvent " << pe->rect() << " " << contentsY () << " " << m_old_contentY << endl; ++ KListView::viewportPaintEvent( pe ); ++ ++ if ( m_lastOne && m_old_contentY != contentsY() ) { ++ m_old_contentY = contentsY(); ++ m_lastOne->repaint(); ++ } ++} ++ ++void ItemView::clear() ++{ ++ KListView::clear(); ++ m_lastOne = 0; ++ m_old_contentY = -1; ++ m_back_url = QString::null; ++} ++ ++void ItemView::contentsWheelEvent(QWheelEvent *e) ++{ ++ KListView::contentsWheelEvent(e); ++ ++ QPoint vp = contentsToViewport(e->pos()); ++ QListViewItem * i = itemAt( vp ); ++ ++ if(i && i->isEnabled() && !i->isSelected() && ++ // FIXME: This is wrong if you drag over the items. ++ (e->state() & (LeftButton|MidButton|RightButton)) == 0) ++ KListView::setSelected(i, true); ++ else if (!i && selectedItem()) ++ KListView::setSelected(selectedItem(), false); ++} ++ ++QDragObject * ItemView::dragObject() ++{ ++ KMultipleDrag* o = 0; ++ QListViewItem *item = itemAt( viewport()->mapFromGlobal(QCursor::pos()) ); ++ if ( item ) { ++ KMenuItem* kitem = static_cast<KMenuItem*>(item); ++ ++ if (dynamic_cast<KMenuItemHeader*>(item)) ++ return 0; ++ ++ o = new KMultipleDrag(viewport()); ++ QPixmap pix = KGlobal::iconLoader()->loadIcon( kitem->icon(), KIcon::Panel, m_iconSize); ++ QPixmap add = KGlobal::iconLoader()->loadIcon( "add", KIcon::Small ); ++ ++ QPainter p( &pix ); ++ p.drawPixmap(pix.height()-add.height(), pix.width()-add.width(), add); ++ p.end(); ++ ++ QBitmap mask; ++ ++ if (pix.mask()) ++ mask = *pix.mask(); ++ else { ++ mask.resize(pix.size()); ++ mask.fill(Qt::color1); ++ } ++ ++ bitBlt( &mask, pix.width()-add.width(), pix.height()-add.height(), add.mask(), 0, 0, add.width(), add.height(), OrROP ); ++ pix.setMask( mask ); ++ o->setPixmap(pix); ++ ++ if(kitem->service()) { ++ // If the path to the desktop file is relative, try to get the full ++ // path from KStdDirs. ++ QString path = kitem->service()->desktopEntryPath(); ++ path = locate("apps", path); ++ o->addDragObject(new KURLDrag(KURL::List(KURL(path)), 0)); ++ } ++ else if (kitem->path().startsWith("kicker:/new") || kitem->path().startsWith("system:/") ++ || kitem->path().startsWith("kicker:/switchuser_") || kitem->path().startsWith("kicker:/restart_")) { ++ delete o; ++ return 0; ++ } ++ else if (kitem->hasChildren()) { ++ o->addDragObject(new KURLDrag(KURL::List(KURL("programs:/"+kitem->menuPath())), 0)); ++ return o; ++ } ++ else if(!kitem->path().isEmpty() && !kitem->path().startsWith("kicker:/") && !kitem->path().startsWith("kaddressbook:/")) { ++ QString uri = kitem->path(); ++ ++ if (uri.startsWith(locateLocal("data", QString::fromLatin1("RecentDocuments/")))) { ++ KDesktopFile df(uri,true); ++ uri=df.readURL(); ++ } ++ ++ o->addDragObject(new KURLDrag(KURL::List(KURL(uri)), 0)); ++ } ++ ++ o->addDragObject(new KMenuItemDrag(*kitem,this)); ++ } ++ return o; ++} ++ ++int ItemView::goodHeight() ++{ ++ int item_height = 0; ++ QListViewItemIterator it( this ); ++ while ( it.current() ) { ++ if ( !dynamic_cast<KMenuSpacer*>( it.current() ) && !it.current()->parent() && it.current()->isVisible() ) { ++ item_height += it.current()->height(); ++ } ++ ++it; ++ } ++ ++ return item_height; ++} ++ ++ ++KMenuItemDrag::KMenuItemDrag(KMenuItem& item, QWidget *dragSource) ++ : QDragObject(dragSource, 0) ++{ ++ QBuffer buff(a); ++ buff.open(IO_WriteOnly); ++ QDataStream s(&buff); ++ ++ s << item.id() << (item.service() ? item.service()->storageId() : QString::null) ++ << item.title() << item.description() << item.icon() << item.path(); ++} ++ ++KMenuItemDrag::~KMenuItemDrag() ++{ ++} ++ ++const char * KMenuItemDrag::format(int i) const ++{ ++ if (i == 0) ++ return "application/kmenuitem"; ++ ++ return 0; ++} ++ ++QByteArray KMenuItemDrag::encodedData(const char* mimeType) const ++{ ++ if (QString("application/kmenuitem") == mimeType) ++ return a; ++ ++ return QByteArray(); ++} ++ ++bool KMenuItemDrag::canDecode(const QMimeSource * e) ++{ ++ if (e->provides( "application/kmenuitem" ) ) ++ return true; ++ ++ return false; ++} ++ ++bool ItemView::acceptDrag (QDropEvent* event) const ++{ ++ if ( !acceptDrops() ) ++ return false; ++ ++ if (KMenuItemDrag::canDecode(event)) ++ return true; ++ ++ if (QTextDrag::canDecode(event)) { ++ QString text; ++ QTextDrag::decode(event,text); ++ return !text.startsWith("programs:/"); ++ } ++ ++ return itemsMovable(); ++} ++ ++bool KMenuItemDrag::decode(const QMimeSource* e, KMenuItemInfo& item) ++{ ++ QByteArray a = e->encodedData("application/kmenuitem"); ++ ++ if (a.isEmpty()) { ++ QStringList l; ++ bool ret = QUriDrag::decodeToUnicodeUris( e, l ); ++ if ( ret ) ++ { ++ for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) ++ { ++ QString url = *it; ++ kdDebug () << "Url " << url << endl; ++ item.m_path = KURL( url ).path(); ++ if ( KDesktopFile::isDesktopFile( item.m_path ) ) ++ { ++ KDesktopFile df( item.m_path, true ); ++ item.m_description = df.readGenericName(); ++ item.m_icon = df.readIcon(); ++ item.m_title = df.readName(); ++ } ++ else ++ { ++ item.m_title = item.m_path; ++ item.m_icon = KMimeType::iconForURL( url ); ++ item.m_title = item.m_path.section( '/', -1, -1 ); ++ int last_slash = url.findRev ('/', -1); ++ if (last_slash == 0) ++ item.m_description = i18n("Directory: /)"); ++ else ++ item.m_description = i18n("Directory: ") + url.section ('/', -2, -2); ++ } ++ ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ QBuffer buff(a); ++ buff.open(IO_ReadOnly); ++ QDataStream s(&buff); ++ ++ KMenuItemInfo i; ++ QString storageId; ++ s >> i.m_id >> storageId >> i.m_title >> i.m_description >> i.m_icon >> i.m_path; ++ ++ i.m_s = storageId.isEmpty() ? 0 : KService::serviceByStorageId(storageId); ++ item = i; ++ ++ return true; ++} ++ ++FavoritesItemView::FavoritesItemView(QWidget* parent, const char* name) ++ : ItemView(parent, name) ++{ ++} ++ ++bool FavoritesItemView::acceptDrag (QDropEvent* event) const ++{ ++ if (event->source()==this->viewport()) ++ return true; ++ ++ if (KMenuItemDrag::canDecode(event)) { ++ KMenuItemInfo item; ++ KMenuItemDrag::decode(event,item); ++ QStringList favs = KickerSettings::favorites(); ++ ++ if (item.m_s) ++ return favs.find(item.m_s->storageId())==favs.end(); ++ else { ++ QStringList::Iterator it; ++ ++ QString uri = item.m_path; ++ ++ if (uri.startsWith(locateLocal("data", QString::fromLatin1("RecentDocuments/")))) { ++ KDesktopFile df(uri,true); ++ uri=df.readURL(); ++ } ++ ++ for (it = favs.begin(); it != favs.end(); ++it) { ++ if ((*it)[0]=='/') { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==uri) ++ break; ++ } ++ } ++ return it==favs.end(); ++ } ++ } ++ ++ if (QTextDrag::canDecode(event)) { ++ QString text; ++ QTextDrag::decode(event,text); ++ QStringList favs = KickerSettings::favorites(); ++ ++ if (text.endsWith(".desktop")) { ++ KService::Ptr p = KService::serviceByDesktopPath(text.replace("file://",QString::null)); ++ return (p && favs.find(p->storageId())==favs.end()); ++ } ++ else { ++ QStringList::Iterator it; ++ for (it = favs.begin(); it != favs.end(); ++it) { ++ if ((*it)[0]=='/') { ++ KDesktopFile df((*it),true); ++ if (df.readURL().replace("file://",QString::null)==text) ++ break; ++ } ++ } ++ return it==favs.end(); ++ } ++ } ++ ++ return itemsMovable(); ++} ++ ++#include "itemview.moc" ++ ++// vim:cindent:sw=4: +--- kicker/ui/media_watcher.cpp (Revision 0) ++++ kicker/ui/media_watcher.cpp (Revision 849791) +@@ -0,0 +1,57 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Stephan Kulow <coolo@novell.com> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#include "media_watcher.h" ++#include <kapplication.h> ++#include <kdebug.h> ++#include <dcopclient.h> ++#include <dcopref.h> ++ ++MediaWatcher::MediaWatcher( QObject *parent ) : ++ QObject( parent ), DCOPObject("mediawatcher") ++{ ++ connectDCOPSignal( "kded", "mediamanager", "mediumAdded(QString,bool)", ++ "slotMediumAdded(QString,bool)", true ); ++ connectDCOPSignal( "kded", "mediamanager", "mediumRemoved(QString,bool)", ++ "slotMediumAdded(QString,bool)", true ); ++ connectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString,bool)", ++ "slotMediumAdded(QString,bool)", true ); ++ ++ updateDevices(); ++} ++ ++void MediaWatcher::updateDevices() ++{ ++ DCOPRef nsd( "kded", "mediamanager" ); ++ nsd.setDCOPClient( kapp->dcopClient() ); ++ m_devices = nsd.call( "fullList" ); ++} ++ ++void MediaWatcher::slotMediumAdded( QString item, bool a ) ++{ ++ updateDevices(); ++ ++ emit mediumChanged(); ++} ++ ++#include "media_watcher.moc" + +Eigenschaftsänderungen: kicker/ui +___________________________________________________________________ +Geändert: svn:ignore + - nonKDEButtonSettings.h +appletitem.h +appletview.cpp +nonKDEButtonSettings.cpp +k_mnu.kidl +appletview.h +appletitem.cpp +k_mnu_skel.cpp +.deps +.libs +Makefile +Makefile.in +*.moc + + + nonKDEButtonSettings.h +appletitem.h +appletview.cpp +nonKDEButtonSettings.cpp +k_mnu.kidl +appletview.h +appletitem.cpp +k_mnu_skel.cpp +.deps +.libs +Makefile +Makefile.in +*.moc +kmenuitembase.cpp +media_watcher.kidl +kmenubase.cpp +kmenuitembase.h +kmenubase.h +media_watcher_skel.cpp + + +--- kicker/buttons/knewbutton.cpp (Revision 0) ++++ kicker/buttons/knewbutton.cpp (Revision 849791) +@@ -0,0 +1,455 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Stephan Binner <binner@kde.org> ++ Stephan Kulow <coolo@kde.org> ++ Dirk Mueller <mueller@kde.org> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#include <cassert> ++#include <cmath> ++ ++#include <qtooltip.h> ++#include <qpainter.h> ++#include <qcursor.h> ++#include <private/qeffects_p.h> ++ ++#include <klocale.h> ++#include <kapplication.h> ++#include <kstandarddirs.h> ++#include <kiconloader.h> ++#include <kdebug.h> ++ ++#include "kickerSettings.h" ++ ++#include "config.h" ++#include "global.h" ++ ++#include "menumanager.h" ++#include "k_mnu_stub.h" ++#include "k_new_mnu.h" ++ ++#include "knewbutton.h" ++#include "knewbutton.moc" ++ ++KNewButton *KNewButton::m_self = 0; ++ ++KNewButton::KNewButton( QWidget* parent ) ++ : KButton( parent ), ++ m_oldPos(0,0) ++{ ++ Q_ASSERT( !m_self ); ++ m_self = this; ++ m_hoverTimer = -1; ++ m_openTimer = -1; ++ m_active = false; ++ m_mouseInside = false; ++ m_drag = false; ++ ++ setIconAlignment((Qt::AlignmentFlags)(AlignTop|AlignRight)); ++ setAcceptDrops(true); ++ setIcon("kmenu-suse"); ++ setDrawArrow(false); ++ ++ m_movie = new QMovie(locate("data", "kicker/pics/kmenu_basic.mng")); ++ m_movie->connectUpdate(this, SLOT(updateMovie())); ++ m_movie->connectStatus(this, SLOT(slotStatus(int))); ++ m_movie->connectResize(this, SLOT(slotSetSize(const QSize&))); ++ ++ QApplication::desktop()->screen()->installEventFilter(this); ++ setMouseTracking(true); ++} ++ ++KNewButton::~KNewButton() ++{ ++ if ( m_self == this ) ++ m_self = 0; ++ setMouseTracking(false); ++ delete m_movie; ++} ++ ++void KNewButton::slotStatus(int status) ++{ ++ if(status == QMovie::EndOfLoop) ++ slotStopAnimation(); ++} ++ ++QColor KNewButton::borderColor() const ++{ ++ QImage img = m_active_pixmap.convertToImage(); ++ ++ for (int i = 0; i < img.width(); ++i) { ++ QRgb rgb = img.pixel(orientation() == Qt::Horizontal ? img.width() - i - 1 : ++ i, 2); ++ ++ if (qGreen(rgb) > 0x50) ++ return rgb; ++ } ++ ++ return img.pixel( orientation() == Qt::Horizontal ? img.width() - 2 : 2, 2); ++} ++ ++void KNewButton::show() ++{ ++ KButton::show(); ++ ++ if (KickerSettings::firstRun()) { ++ QTimer::singleShot(500,this,SLOT(slotExecMenu())); ++ KickerSettings::setFirstRun(false); ++ KickerSettings::writeConfig(); ++ } ++} ++ ++void KNewButton::updateMovie() ++{ ++ m_oldPos = QPoint( -1, -1 ); ++ drawEye(); ++ ++ if (!m_active && m_movie->running()) ++ m_movie->pause(); ++} ++ ++void KNewButton::setPopupDirection(KPanelApplet::Direction d) ++{ ++ KButton::setPopupDirection(d); ++ ++ delete m_movie; ++ ++ switch (d) { ++ case KPanelApplet::Left: ++ setIconAlignment((Qt::AlignmentFlags)(AlignTop|AlignLeft)); ++ m_movie = new QMovie(locate("data", "kicker/pics/kmenu_vertical.mng")); ++ break; ++ case KPanelApplet::Right: ++ setIconAlignment((Qt::AlignmentFlags)(AlignTop|AlignRight)); ++ m_movie = new QMovie(locate("data", "kicker/pics/kmenu_vertical.mng")); ++ break; ++ case KPanelApplet::Up: ++ setIconAlignment((Qt::AlignmentFlags)(AlignTop|AlignHCenter)); ++ m_movie = new QMovie(locate("data", "kicker/pics/kmenu_basic.mng")); ++ break; ++ case KPanelApplet::Down: ++ setIconAlignment((Qt::AlignmentFlags)(AlignBottom|AlignHCenter)); ++ m_movie = new QMovie(locate("data", "kicker/pics/kmenu_flipped.mng")); ++ } ++ ++ m_movie->connectUpdate(this, SLOT(updateMovie())); ++ m_movie->connectStatus(this, SLOT(slotStatus(int))); ++ m_movie->connectResize(this, SLOT(slotSetSize(const QSize&))); ++} ++ ++void KNewButton::slotSetSize(const QSize& s) ++{ ++ m_iconSize = s; ++} ++ ++double KNewButton::buttonScaleFactor(const QSize& s) const ++{ ++ double sf = 1.0; ++ ++ switch (popupDirection()) { ++ case KPanelApplet::Left: ++ case KPanelApplet::Right: ++// sf = kMin(double(s.width()) / m_iconSize.height(), double(s.height()) / m_iconSize.width()); ++// break; ++ case KPanelApplet::Up: ++ case KPanelApplet::Down: ++ sf = kMin(double(s.width()) / m_iconSize.width(), double(s.height()) / m_iconSize.height()); ++ break; ++ } ++ ++ if (sf > 0.8) sf = 1.0; ++ return sf; ++} ++ ++int KNewButton::widthForHeight(int height) const ++{ ++ int r = m_iconSize.width() * buttonScaleFactor(QSize(m_iconSize.width(), height)); ++ ++ if (!m_movie->running() && height != m_active_pixmap.height()) ++ { ++ KNewButton* that = const_cast<KNewButton*>(this); ++ QTimer::singleShot(0, that, SLOT(slotStopAnimation())); ++ } ++ ++ return r; ++} ++ ++int KNewButton::preferredDimension(int panelDim) const ++{ ++ return kMax(m_icon.width(), m_icon.height()); ++} ++ ++int KNewButton::heightForWidth(int width) const ++{ ++ int r = m_iconSize.width() * buttonScaleFactor(QSize(width, m_iconSize.height())); ++ if (!m_movie->running() && width != m_active_pixmap.width()) ++ { ++ KNewButton* that = const_cast<KNewButton*>(this); ++ QTimer::singleShot(0, that, SLOT(slotStopAnimation())); ++ } ++ return r; ++} ++ ++bool KNewButton::eventFilter(QObject *o, QEvent *e) ++{ ++ if (e->type() == QEvent::MouseButtonRelease || ++ e->type() == QEvent::MouseButtonPress || ++ e->type() == QEvent::MouseButtonDblClick ) ++ { ++ QMouseEvent *me = static_cast<QMouseEvent *>(e); ++ if (rect().contains(mapFromGlobal(me->globalPos()))) ++ { ++ if (m_pressedDuringPopup && m_popup && m_openTimer != -1 ++ && (me->button() & Qt::LeftButton) ) ++ return true; ++ } ++ } ++ ++ if (KickerSettings::kickoffDrawGeekoEye() && e->type() == QEvent::MouseMove) ++ { ++ QMouseEvent *me = static_cast<QMouseEvent *>(e); ++ if ((me->state() & MouseButtonMask) == NoButton) ++ drawEye(); ++ } ++ ++ return KButton::eventFilter(o, e); ++} ++ ++void KNewButton::drawEye() ++{ ++#define eye_x 62 ++#define eye_y 13 ++ QPoint mouse = QCursor::pos(); ++ QPoint me = mapToGlobal(QPoint(eye_x, eye_y)); ++ double a = atan2(mouse.y() - me.y(), mouse.x() - me.x()); ++ int dx = int(2.1 * cos(a)); ++ int dy = int(2.1 * sin(a)); ++ ++ QPoint newpos(eye_x+dx,eye_y+dy); ++ if (newpos!=m_oldPos) { ++ m_oldPos = newpos; ++ QPixmap pixmap = m_active_pixmap; ++ ++ double sf = 1.0; ++ ++ if(!m_movie->framePixmap().isNull()) ++ { ++ pixmap = m_movie->framePixmap(); ++ pixmap.detach(); ++ m_iconSize = pixmap.size(); ++ sf = buttonScaleFactor(size()); ++ ++ if (KickerSettings::kickoffDrawGeekoEye()) { ++ QPainter p(&pixmap); ++ p.setPen(white); ++ p.setBrush(white); ++ // p.setPen(QColor(110,185,55)); ++ p.drawRect(eye_x+dx, eye_y+dy, 2, 2); ++ p. end(); ++ } ++ } ++ ++ QWMatrix matrix; ++ switch (popupDirection()) { ++ case KPanelApplet::Left: ++ matrix.scale(sf, -sf); ++ matrix.rotate(90); ++ break; ++ case KPanelApplet::Up: ++ matrix.scale(sf, sf); ++ break; ++ case KPanelApplet::Right: ++ matrix.scale(sf, -sf); ++ matrix.rotate(90); ++ break; ++ case KPanelApplet::Down: ++ matrix.scale(sf, sf); ++ break; ++ } ++ m_active_pixmap = pixmap.xForm(matrix); ++ ++ repaint(false); ++ } ++#undef eye_x ++#undef eye_y ++} ++ ++void KNewButton::enterEvent(QEvent* e) ++{ ++ KButton::enterEvent(e); ++ ++ QSize s(size()); ++ s *= 0.25; ++ s = s.expandedTo(QSize(6,6)); ++ ++ switch (popupDirection()) { ++ case KPanelApplet::Left: ++ m_sloppyRegion = QRect(rect().topRight() - QPoint(s.width()-1, 0), s); ++ break; ++ case KPanelApplet::Right: ++ m_sloppyRegion = QRect(rect().topLeft(), s); ++ break; ++ case KPanelApplet::Up: ++ m_sloppyRegion = QRect(rect().bottomLeft() - QPoint(0, s.height()-1), s); ++ break; ++ case KPanelApplet::Down: ++ m_sloppyRegion = QRect(rect().topLeft(), s); ++ } ++ ++ m_active = true; ++ m_movie->unpause(); ++ m_movie->restart(); ++} ++ ++void KNewButton::rewindMovie() ++{ ++ m_oldPos = QPoint( -1, -1 ); ++ m_movie->unpause(); ++} ++ ++void KNewButton::dragEnterEvent(QDragEnterEvent* /*e*/) ++{ ++ if (m_hoverTimer != -1) ++ killTimer(m_hoverTimer); ++ ++ m_hoverTimer = startTimer(QApplication::startDragTime()); ++ m_mouseInside = true; ++ m_drag = true; ++} ++ ++void KNewButton::dragLeaveEvent(QDragLeaveEvent* /*e*/) ++{ ++ m_mouseInside = false; ++ m_drag = false; ++} ++ ++void KNewButton::leaveEvent(QEvent* e) ++{ ++ m_mouseInside = false; ++ if (m_hoverTimer != -1) ++ killTimer(m_hoverTimer); ++ m_hoverTimer = -1; ++ ++ KButton::leaveEvent(e); ++} ++ ++void KNewButton::mouseMoveEvent(QMouseEvent* e) ++{ ++ KButton::mouseMoveEvent(e); ++ ++ m_mouseInside = m_sloppyRegion.contains(e->pos()); ++ ++ if ( m_sloppyRegion.contains(e->pos())) ++ { ++ if (m_hoverTimer == -1 && KickerSettings::openOnHover()) ++ m_hoverTimer = startTimer(kMax(200,QApplication::doubleClickInterval()/2)); ++ } ++ else if (m_hoverTimer != -1) ++ { ++ killTimer(m_hoverTimer); ++ m_hoverTimer = -1; ++ } ++} ++ ++void KNewButton::slotStopAnimation() ++{ ++ m_active = false; ++ m_movie->pause(); ++ m_movie->restart(); ++ QTimer::singleShot(200, this, SLOT(rewindMovie())); ++} ++ ++const QPixmap& KNewButton::labelIcon() const ++{ ++ return m_active_pixmap; ++} ++ ++void KNewButton::slotExecMenu() ++{ ++ if (m_openTimer != -1) ++ killTimer(m_openTimer); ++ ++ m_openTimer = startTimer(QApplication::doubleClickInterval() * 3); ++ ++ if (m_active) ++ { ++ m_active = false; ++ m_movie->pause(); ++ m_movie->restart(); ++ } ++ ++ KButton::slotExecMenu(); ++ ++ assert(!KickerTip::tippingEnabled()); ++ assert(dynamic_cast<KMenu*>(m_popup)); ++ ++ disconnect(dynamic_cast<KMenu*>(m_popup), SIGNAL(aboutToHide()), this, ++ SLOT(slotStopAnimation())); ++ connect(dynamic_cast<KMenu*>(m_popup), SIGNAL(aboutToHide()), ++ SLOT(slotStopAnimation())); ++ ++ m_popup->move(KickerLib::popupPosition(popupDirection(), m_popup, this)); ++ // I wish KMenu would properly done itself when it closes. But it doesn't. ++ ++ bool useEffect = true; // could be QApplication::isEffectEnabled() ++ useEffect = false; // too many Qt bugs to be useful ++ if (m_drag) ++ useEffect = false; ++ ++ m_drag = false; // once is enough ++ ++ if (useEffect) ++ { ++ switch (popupDirection()) { ++ case KPanelApplet::Left: ++ qScrollEffect(m_popup, QEffects::LeftScroll); ++ break; ++ case KPanelApplet::Up: ++ qScrollEffect(m_popup, QEffects::UpScroll); ++ break; ++ case KPanelApplet::Right: ++ qScrollEffect(m_popup, QEffects::RightScroll); ++ break; ++ case KPanelApplet::Down: ++ qScrollEffect(m_popup, QEffects::DownScroll); ++ break; ++ } ++ } ++ else ++ static_cast<KMenu*>(m_popup)->show(); ++} ++ ++void KNewButton::timerEvent(QTimerEvent* e) ++{ ++ if (e->timerId() == m_hoverTimer) ++ { ++ if (m_mouseInside && !isDown()) ++ showMenu(); ++ ++ killTimer(m_hoverTimer); ++ m_hoverTimer = -1; ++ } ++ if (e->timerId() == m_openTimer) ++ { ++ killTimer(m_openTimer); ++ m_openTimer = -1; ++ } ++} +--- kicker/buttons/knewbutton.h (Revision 0) ++++ kicker/buttons/knewbutton.h (Revision 849791) +@@ -0,0 +1,98 @@ ++/***************************************************************** ++ ++Copyright (c) 2006 Stephan Binner <binner@kde.org> ++ Stephan Kulow <coolo@kde.org> ++ Dirk Mueller <mueller@kde.org> ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++******************************************************************/ ++ ++#ifndef __knewbutton_h__ ++#define __knewbutton_h__ ++ ++#include "kbutton.h" ++ ++#include <qmovie.h> ++#include <qpoint.h> ++ ++/** ++ * Button that contains the PanelKMenu and client menu manager. ++ */ ++class KNewButton : public KButton ++{ ++ Q_OBJECT ++ ++public: ++ KNewButton( QWidget *parent ); ++ ~KNewButton(); ++ ++ static KNewButton *self() { return m_self; } ++ ++ void loadConfig( const KConfigGroup& config ); ++ ++ virtual const QPixmap& labelIcon() const; ++ ++ virtual int widthForHeight(int height) const; ++ virtual int preferredDimension(int panelDim) const; ++ virtual int heightForWidth(int width) const; ++ ++ QColor borderColor() const; ++ ++ virtual void setPopupDirection(KPanelApplet::Direction d); ++ ++private slots: ++ void slotStatus(int); ++ void slotSetSize(const QSize&); ++ void slotStopAnimation(); ++ void rewindMovie(); ++ void updateMovie(); ++ ++protected: ++ virtual void show(); ++ virtual void slotExecMenu(); ++ virtual QString tileName() { return "KMenu"; } ++ virtual QString defaultIcon() const { return "go"; } ++ ++ virtual void enterEvent(QEvent* e); ++ virtual void leaveEvent(QEvent* e); ++ virtual void mouseMoveEvent(QMouseEvent* e); ++ virtual void dragEnterEvent(QDragEnterEvent*); ++ virtual void dragLeaveEvent(QDragLeaveEvent*); ++ virtual bool eventFilter(QObject *, QEvent *); ++ void timerEvent(QTimerEvent*); ++ ++private: ++ void drawEye(); ++ double buttonScaleFactor(const QSize& s) const; ++ ++ QMovie* m_movie; ++ QPixmap m_active_pixmap; ++ QPoint m_oldPos; ++ QSize m_iconSize; ++ QRect m_sloppyRegion; ++ int m_hoverTimer; ++ int m_openTimer; ++ bool m_active; ++ bool m_mouseInside; ++ bool m_drag; ++ ++ static KNewButton *m_self; ++}; ++ ++#endif +--- kicker/buttons/browserbutton.cpp (Revision 849788) ++++ kicker/buttons/browserbutton.cpp (Revision 849791) +@@ -65,7 +65,7 @@ + topMenu = new PanelBrowserMenu( path ); + setPopup(topMenu); + +- _menuTimer = new QTimer( this ); ++ _menuTimer = new QTimer( this, "_menuTimer" ); + connect( _menuTimer, SIGNAL(timeout()), SLOT(slotDelayedPopup()) ); + + QToolTip::add(this, i18n("Browse: %1").arg(path)); +--- kicker/buttons/kbutton.cpp (Revision 849788) ++++ kicker/buttons/kbutton.cpp (Revision 849791) +@@ -33,6 +33,7 @@ + + #include "menumanager.h" + #include "k_mnu.h" ++#include "k_mnu_stub.h" + + #include "kbutton.h" + #include "kbutton.moc" +@@ -43,7 +44,7 @@ + QToolTip::add(this, i18n("Applications, tasks and desktop sessions")); + setTitle(i18n("K Menu")); + +- setPopup(MenuManager::the()->kmenu()); ++ setPopup(MenuManager::the()->kmenu()->widget()); + MenuManager::the()->registerKButton(this); + setIcon("kmenu"); + +--- kicker/buttons/Makefile.am (Revision 849788) ++++ kicker/buttons/Makefile.am (Revision 849791) +@@ -1,10 +1,10 @@ + INCLUDES = -I$(srcdir)/../core -I$(srcdir)/../../libkicker -I../../libkicker \ +- -I$(srcdir)/../ui -I$(top_srcdir)/libkonq $(all_includes) ++ -I../ui -I$(srcdir)/../ui -I$(top_srcdir)/libkonq $(all_includes) + + noinst_LTLIBRARIES = libkicker_buttons.la + + libkicker_buttons_la_SOURCES = servicebutton.cpp bookmarksbutton.cpp \ +- browserbutton.cpp \ ++ browserbutton.cpp knewbutton.cpp \ + desktopbutton.cpp extensionbutton.cpp kbutton.cpp \ + nonkdeappbutton.cpp servicemenubutton.cpp urlbutton.cpp \ + windowlistbutton.cpp +--- applets/media/mediumbutton.cpp (Revision 849788) ++++ applets/media/mediumbutton.cpp (Revision 849791) +@@ -45,7 +45,8 @@ + #include <konq_drag.h> + + MediumButton::MediumButton(QWidget *parent, const KFileItem &fileItem) +- : PanelPopupButton(parent), mActions(this, this), mFileItem(fileItem) ++ : PanelPopupButton(parent), mActions(this, this), mFileItem(fileItem), mOpenTimer(0, ++ "MediumButton::mOpenTimer") + { + KAction *a = KStdAction::paste(this, SLOT(slotPaste()), + &mActions, "pasteto"); +@@ -74,9 +75,9 @@ + + MediumButton::~MediumButton() + { +- QPopupMenu *menu = popup(); +- setPopup(0); +- delete menu; ++ QPopupMenu *menu = static_cast<QPopupMenu*>(popup()); ++ setPopup(0); ++ delete menu; + } + + const KFileItem &MediumButton::fileItem() const +@@ -94,29 +95,29 @@ + + void MediumButton::initPopup() + { +- QPopupMenu *old_popup = popup(); +- +- KFileItemList items; +- items.append(&mFileItem); +- +- KonqPopupMenu::KonqPopupFlags kpf = +- KonqPopupMenu::ShowProperties +- | KonqPopupMenu::ShowNewWindow; +- +- KParts::BrowserExtension::PopupFlags bef = +- KParts::BrowserExtension::DefaultPopupItems; +- +- KonqPopupMenu *new_popup = new KonqPopupMenu(0L, items, +- KURL("media:/"), mActions, 0L, +- this, kpf, bef); +- KPopupTitle *title = new KPopupTitle(new_popup); +- title->setTitle(mFileItem.text()); +- +- new_popup->insertItem(title, -1, 0); +- +- setPopup(new_popup); +- +- if (old_popup!=0L) delete old_popup; ++ QPopupMenu *old_popup = static_cast<QPopupMenu*>(popup()); ++ ++ KFileItemList items; ++ items.append(&mFileItem); ++ ++ KonqPopupMenu::KonqPopupFlags kpf = ++ KonqPopupMenu::ShowProperties ++ | KonqPopupMenu::ShowNewWindow; ++ ++ KParts::BrowserExtension::PopupFlags bef = ++ KParts::BrowserExtension::DefaultPopupItems; ++ ++ KonqPopupMenu *new_popup = new KonqPopupMenu(0L, items, ++ KURL("media:/"), mActions, 0L, ++ this, kpf, bef); ++ KPopupTitle *title = new KPopupTitle(new_popup); ++ title->setTitle(mFileItem.text()); ++ ++ new_popup->insertItem(title, -1, 0); ++ ++ setPopup(new_popup); ++ ++ if (old_popup!=0L) delete old_popup; + } + + void MediumButton::refreshType() +--- applets/naughty/NaughtyProcessMonitor.cpp (Revision 849788) ++++ applets/naughty/NaughtyProcessMonitor.cpp (Revision 849791) +@@ -94,7 +94,7 @@ + d = new NaughtyProcessMonitorPrivate; + d->interval_ = interval * 1000; + d->triggerLevel_ = triggerLevel; +- d->timer_ = new QTimer(this); ++ d->timer_ = new QTimer(this, "NaughtyProcessMonitorPrivate::timer"); + connect(d->timer_, SIGNAL(timeout()), this, SLOT(slotTimeout())); + } + +--- applets/launcher/quicklauncher.cpp (Revision 849788) ++++ applets/launcher/quicklauncher.cpp (Revision 849791) +@@ -110,7 +110,7 @@ + m_configAction = new KAction(i18n("Configure Quicklauncher..."), "configure", KShortcut(), + this, SLOT(slotConfigure()), this); + +- m_saveTimer = new QTimer(this); ++ m_saveTimer = new QTimer(this, "m_saveTimer"); + connect(m_saveTimer, SIGNAL(timeout()), this, SLOT(saveConfig())); + + m_popularity = new PopularityStatistics(); +--- applets/trash/trashbutton.cpp (Revision 849788) ++++ applets/trash/trashbutton.cpp (Revision 849791) +@@ -78,7 +78,7 @@ + + void TrashButton::initPopup() + { +- QPopupMenu *old_popup = popup(); ++ QPopupMenu *old_popup = static_cast<QPopupMenu*>(popup()); + + KFileItemList items; + items.append(&mFileItem); +--- applets/systemtray/systemtrayapplet.cpp (Revision 849788) ++++ applets/systemtray/systemtrayapplet.cpp (Revision 849791) +@@ -375,7 +375,7 @@ + connect(m_expandButton, SIGNAL(clicked()), + this, SLOT(toggleExpanded())); + +- m_autoRetractTimer = new QTimer(this); ++ m_autoRetractTimer = new QTimer(this, "m_autoRetractTimer"); + connect(m_autoRetractTimer, SIGNAL(timeout()), + this, SLOT(checkAutoRetract())); + } +--- applets/clock/clock.cpp (Revision 849788) ++++ applets/clock/clock.cpp (Revision 849791) +@@ -863,8 +863,8 @@ + _calendar(0), + _disableCalendar(false), + _clock(0), +- _timer(new QTimer(this)), +- m_layoutTimer(new QTimer(this)), ++ _timer(new QTimer(this, "ClockApplet::_timer")), ++ m_layoutTimer(new QTimer(this, "m_layoutTimer")), + m_layoutDelay(0), + m_followBackgroundSetting(true), + m_dateFollowBackgroundSetting(true), +--- applets/minipager/pagerbutton.cpp (Revision 849788) ++++ applets/minipager/pagerbutton.cpp (Revision 849791) +@@ -70,6 +70,8 @@ + m_bgPixmap(0), + m_isCommon(false), + m_currentWindow(0), ++ m_updateCompressor(0, "KMiniPagerButton::updateCompressor"), ++ m_dragSwitchTimer(0, "KMiniPagerButton::dragSwitchTimer"), + m_inside(false) + { + setToggleButton(true); +--- data/kmenu_side/Makefile.am (Revision 849788) ++++ data/kmenu_side/Makefile.am (Revision 849791) +@@ -1,6 +1,5 @@ +-kicker_kmenuside_pics_data_DATA = kside.png kside_tile.png ++kicker_kmenuside_pics_data_DATA = kside.png kside_tile.png ++kicker_kmenuside_pics_datadir = $(kde_datadir)/kicker/pics + +-kicker_kmenuside_pics_datadir = $(kde_datadir)/kicker/pics/ +- + EXTRA_DIST = $(kicker_kmenuside_pics_data_DATA) + +--- data/Makefile.am (Revision 849788) ++++ data/Makefile.am (Revision 849791) +@@ -1 +1 @@ +-SUBDIRS = icons tiles app_start_anim wallpaper kmenu_side ++SUBDIRS = icons tiles app_start_anim wallpaper kmenu_side kickoff +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr32-action-suspend2disk.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-left.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/main_corner_tr.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr48-app-recently_used.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-top-left.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/right_triangle.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr16-action-suspend2disk.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/crsc-action-suspend2ram.svgz +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr128-action-suspend2ram.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr32-action-leave.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/left_triangle.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/menu_separator.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr32-action-suspend2ram.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr48-action-leave.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr16-action-suspend2ram.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-top-center.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-center.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr64-action-suspend2ram.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr48-action-suspend2ram.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-gradient.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/crsc-action-leave.svgz +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/kmenu_vertical.mng +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr64-action-suspend2disk.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr48-action-suspend2disk.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/resize_handle.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/kmenu_basic.mng +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/kmenu_flipped.mng +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-running.mng +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-right.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-tab-top-right.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +--- data/kickoff/Makefile.am (Revision 0) ++++ data/kickoff/Makefile.am (Revision 849791) +@@ -0,0 +1,14 @@ ++kicker_kmenuside_pics_data_DATA = resize_handle.png \ ++ main_corner_tl.png main_corner_tr.png search-gradient.png \ ++ menu_separator.png search-tab-center.png search-tab-left.png \ ++ search-tab-right.png search-tab-top-center.png search-tab-top-left.png \ ++ left_triangle.png right_triangle.png \ ++ kmenu_basic.mng kmenu_flipped.mng kmenu_vertical.mng \ ++ search-tab-top-right.png search-gradient-topdown.png search-running.mng ++ ++kicker_kmenuside_pics_datadir = $(kde_datadir)/kicker/pics ++ ++EXTRA_DIST = $(kicker_kmenuside_pics_data_DATA) ++ ++kickerdir = $(kde_datadir)/kicker/icons ++kicker_ICON = leave recently_used suspend2disk suspend2ram +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/cr128-action-suspend2disk.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/crsc-action-suspend2disk.svgz +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/search-gradient-topdown.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + +Kann nicht anzeigen: Dateityp ist als binär angegeben. +svn:mime-type = application/octet-stream + +Eigenschaftsänderungen: data/kickoff/main_corner_tl.png +___________________________________________________________________ +Hinzugefügt: svn:mime-type + + application/octet-stream + + +Eigenschaftsänderungen: data/kickoff +___________________________________________________________________ +Hinzugefügt: svn:ignore + + Makefile +Makefile.in + + diff --git a/opensuse/core/tdebase/kio-media-errorhandling.diff b/opensuse/core/tdebase/kio-media-errorhandling.diff new file mode 100644 index 000000000..fd9420f3b --- /dev/null +++ b/opensuse/core/tdebase/kio-media-errorhandling.diff @@ -0,0 +1,18 @@ +Index: kioslave/media/mediaimpl.cpp +=================================================================== +--- kioslave/media/mediaimpl.cpp.orig ++++ kioslave/media/mediaimpl.cpp +@@ -274,6 +274,13 @@ bool MediaImpl::ensureMediumMounted(Medi + return m_lastErrorCode==0; + } + ++ if (medium.id().isEmpty()) ++ { ++ m_lastErrorCode = KIO::ERR_COULD_NOT_MOUNT; ++ m_lastErrorMessage = i18n("No such medium."); ++ return false; ++ } ++ + return true; + } + diff --git a/opensuse/core/tdebase/klipperrc.diff b/opensuse/core/tdebase/klipperrc.diff new file mode 100644 index 000000000..d18b4852f --- /dev/null +++ b/opensuse/core/tdebase/klipperrc.diff @@ -0,0 +1,22 @@ +Index: klipper/klipperrc.desktop +=================================================================== +--- klipper/klipperrc.desktop.orig ++++ klipper/klipperrc.desktop +@@ -232,7 +232,7 @@ Number of commands=5 + Regexp=^https?://. + + [Action_1/Command_0] +-Commandline=kfmclient exec %s ++Commandline=kfmclient openURL %s + Description=Open with &Konqueror + Description[af]=Maak oop met Konqueror + Description[ar]=Ø¥ÙØªØ Ø¨Ù€Ù€ &Konqueror +@@ -1644,7 +1644,7 @@ Number of commands=5 + Regexp=^ftp://. + + [Action_6/Command_0] +-Commandline=kfmclient exec %s ++Commandline=kfmclient openURL %s + Description=Open with &Konqueror + Description[af]=Maak oop met Konqueror + Description[ar]=Ø¥ÙØªØ Ø¨Ù€Ù€ &Konqueror diff --git a/opensuse/core/tdebase/kmenu-search-fs20050503-fixed.diff b/opensuse/core/tdebase/kmenu-search-fs20050503-fixed.diff new file mode 100644 index 000000000..aa36d6a22 --- /dev/null +++ b/opensuse/core/tdebase/kmenu-search-fs20050503-fixed.diff @@ -0,0 +1,342 @@ +Index: kicker/kicker/ui/k_mnu.cpp +=================================================================== +--- kicker/kicker/ui/k_mnu.cpp.orig ++++ kicker/kicker/ui/k_mnu.cpp +@@ -26,9 +26,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <unistd.h> + #include <dmctl.h> + ++#include <qhbox.h> + #include <qimage.h> ++#include <qlabel.h> + #include <qpainter.h> + #include <qstyle.h> ++#include <qtimer.h> ++#include <qtooltip.h> + + #include <dcopclient.h> + #include <kapplication.h> +@@ -40,9 +44,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <kglobal.h> + #include <kglobalsettings.h> + #include <kiconloader.h> ++#include <klineedit.h> + #include <klocale.h> + #include <kmessagebox.h> + #include <kstandarddirs.h> ++#include <ktoolbarbutton.h> + #include <kwin.h> + + #include "client_mnu.h" +@@ -58,9 +64,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include "quickbrowser_mnu.h" + #include "recentapps.h" + ++ + #include "k_mnu.h" + #include "k_mnu.moc" + ++const int PanelKMenu::searchLineID(23140 /*whatever*/); ++ + PanelKMenu::PanelKMenu() + : PanelServiceMenu(QString::null, QString::null, 0, "KMenu") + , bookmarkMenu(0) +@@ -165,6 +174,26 @@ void PanelKMenu::paletteChanged() + } + } + ++ ++/* A MenuHBox is supposed to be inserted into a menu. ++ * You can set a special widget in the hbox which will ++ * get the focus if the user moves up or down with the ++ * cursor keys ++ */ ++class MenuHBox : public QHBox { ++public: ++ MenuHBox(PanelKMenu* parent) : QHBox(parent) ++ { ++ } ++ ++ virtual void keyPressEvent(QKeyEvent *e) ++ { ++ ++ } ++private: ++ PanelKMenu *parent; ++}; ++ + void PanelKMenu::initialize() + { + // kdDebug(1210) << "PanelKMenu::initialize()" << endl; +@@ -191,13 +220,29 @@ void PanelKMenu::initialize() + // add services + PanelServiceMenu::initialize(); + ++ // Insert search field ++ QHBox* hbox = new QHBox( this ); ++ KToolBarButton *clearButton = new KToolBarButton( "locationbar_erase", 0, hbox ); ++ searchEdit = new KLineEdit(hbox); searchEdit->setClickMessage(" "+i18n("Press '/' to search...")); ++ hbox->setFocusPolicy(QWidget::StrongFocus); ++ hbox->setFocusProxy(searchEdit); ++ hbox->setSpacing( 3 ); ++ connect(clearButton, SIGNAL(clicked()), searchEdit, SLOT(clear())); ++ connect(this, SIGNAL(aboutToHide()), this, SLOT(slotClearSearch())); ++ connect(searchEdit, SIGNAL(textChanged(const QString&)), ++ this, SLOT( slotUpdateSearch( const QString&))); ++ insertItem(hbox, searchLineID, 0); ++ ++ //QToolTip::add(clearButton, i18n("Clear Search")); ++ //QToolTip::add(searchEdit, i18n("Enter the name of an application")); ++ + if (KickerSettings::showMenuTitles()) + { + int id; + id = insertItem(new PopupMenuTitle(i18n("All Applications"), font()), -1 /* id */, 0); +- setItemEnabled( id, false ); ++ setItemEnabled(id, false); + id = insertItem(new PopupMenuTitle(i18n("Actions"), font()), -1 /* id */, -1); +- setItemEnabled( id, false ); ++ setItemEnabled(id, false); + } + + // create recent menu section +@@ -737,3 +782,43 @@ void PanelKMenu::clearRecentMenuItems() + } + + ++void PanelKMenu::slotUpdateSearch(const QString& searchString) ++{ ++ kdDebug() << "Searching for " << searchString << endl; ++ setSearchString(searchString); ++} ++ ++void PanelKMenu::slotClearSearch() ++{ ++ if (searchEdit && searchEdit->text().isEmpty() == false) { ++ QTimer::singleShot(0, searchEdit, SLOT(clear())); ++ } ++} ++ ++void PanelKMenu::keyPressEvent(QKeyEvent* e) ++{ ++ // We move the focus to the search field if the ++ // user presses '/'. This is the same shortcut as ++ // konqueror is using, and afaik it's hardcoded both ++ // here and there. This sucks badly for many non-us ++ // keyboard layouts, but for the sake of consistency ++ // we follow konqueror. ++ if (!searchEdit) return KPanelMenu::keyPressEvent(e); ++ ++ if (e->key() == Qt::Key_Slash && !searchEdit->hasFocus()) { ++ if (indexOf(searchLineID) >=0 ) { ++ setActiveItem(indexOf(searchLineID)); ++ } ++ } ++ else if (e->key() == Qt::Key_Escape && searchEdit->text().isEmpty() == false) { ++ searchEdit->clear(); ++ } ++ else if (e->key() == Qt::Key_Delete && !searchEdit->hasFocus() && ++ searchEdit->text().isEmpty() == false) ++ { ++ searchEdit->clear(); ++ } ++ else { ++ KPanelMenu::keyPressEvent(e); ++ } ++} +Index: kicker/kicker/ui/k_mnu.h +=================================================================== +--- kicker/kicker/ui/k_mnu.h.orig ++++ kicker/kicker/ui/k_mnu.h +@@ -73,6 +73,8 @@ protected slots: + void slotSaveSession(); + void slotRunCommand(); + void slotEditUserContact(); ++ void slotUpdateSearch(const QString &searchtext); ++ void slotClearSearch(); + void paletteChanged(); + virtual void configChanged(); + void updateRecent(); +@@ -89,6 +91,8 @@ protected: + void doNewSession(bool lock); + void createRecentMenuItems(); + virtual void clearSubmenus(); ++ void filterMenu(PanelServiceMenu* menu, const QString &searchString); ++ void keyPressEvent(QKeyEvent* e); + + private: + QPopupMenu *sessionsMenu; +@@ -101,6 +105,8 @@ private: + KActionCollection *actionCollection; + KBookmarkOwner *bookmarkOwner; + PopupMenuList dynamicSubMenus; ++ KLineEdit *searchEdit; ++ static const int searchLineID; + }; + + #endif +Index: kicker/kicker/ui/service_mnu.cpp +=================================================================== +--- kicker/kicker/ui/service_mnu.cpp.orig ++++ kicker/kicker/ui/service_mnu.cpp +@@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <qbitmap.h> + #include <qpixmap.h> + #include <qimage.h> ++#include <qmap.h> + + #include <dcopclient.h> + #include <kapplication.h> +@@ -100,6 +101,8 @@ void PanelServiceMenu::initialize() + clear(); + + clearSubmenus(); ++ searchSubMenuIDs.clear(); ++ searchMenuItems.clear(); + doInitialize(); + } + +@@ -296,6 +299,10 @@ void PanelServiceMenu::fillMenu(KService + + int newId = insertItem(iconset, groupCaption, m, id++); + entryMap_.insert(newId, static_cast<KSycocaEntry*>(g)); ++ // This submenu will be searched when applying a search string ++ searchSubMenuIDs[m] = newId; ++ // Also search the submenu name itself ++ searchMenuItems.insert(newId); + // We have to delete the sub menu our selves! (See Qt docs.) + subMenus.append(m); + } +@@ -308,6 +315,7 @@ void PanelServiceMenu::fillMenu(KService + } + + KService::Ptr s(static_cast<KService *>(e)); ++ searchMenuItems.insert(id); + insertMenuItem(s, id++, -1, &suppressGenericNames, QString::null, specialTitle[s->name()], categoryIcon[s->name()] ); + } + else if (e->isType(KST_KServiceSeparator)) +@@ -900,6 +908,8 @@ void PanelServiceMenu::slotClear() + delete *it; + } + subMenus.clear(); ++ searchSubMenuIDs.clear(); ++ searchMenuItems.clear(); + } + + void PanelServiceMenu::selectFirstItem() +@@ -924,3 +934,72 @@ void PanelServiceMenu::updateRecentlyUse + RecentlyLaunchedApps::the().m_bNeedToUpdate = true; + } + ++void PanelServiceMenu::setSearchString(const QString &searchString) ++{ ++ // We must initialize the menu, because it might have not been opened before ++ initialize(); ++ ++ bool foundSomething = false; ++ std::set<int> nonemptyMenus; ++ std::set<int>::const_iterator menuItemIt(searchMenuItems.begin()); ++ // Apply the filter on this menu ++ for (; menuItemIt != searchMenuItems.end(); ++menuItemIt) { ++ int id = *menuItemIt; ++ KService* s = dynamic_cast< KService* >( static_cast< KSycocaEntry* >( entryMap_[ id ])); ++ QString menuText = text(id); ++ if (menuText.contains(searchString, false) > 0 ++ || ( s != NULL && ( s->name().contains(searchString, false) > 0 ++ || s->exec().contains(searchString, false) > 0 ++ || s->comment().contains(searchString, false) > 0 ++ || s->genericName().contains(searchString, false) > 0 ++ || s->exec().contains(searchString, false) > 0 ) ++ )) { ++ setItemEnabled(id, true); ++ foundSomething = true; ++ nonemptyMenus.insert(id); ++ } ++ else { ++ setItemEnabled(id, false); ++ } ++ } ++ // Apply the filter on this menu ++ /*for (int i=count()-1; i>=0; --i) { ++ int id = idAt(i); ++ QString menuText = text(id); ++ if (menuText.contains(searchString, false) > 0) { ++ setItemEnabled(id, true); ++ foundSomething = true; ++ nonemptyMenus.insert(id); ++ } ++ else { ++ setItemEnabled(id, false); ++ } ++ }*/ ++ ++ PanelServiceMenuMap::iterator it(searchSubMenuIDs.begin()); ++ // Apply the search filter on submenus ++ for (; it != searchSubMenuIDs.end(); ++it) { ++ it.key()->setSearchString(searchString); ++ if (nonemptyMenus.find(it.data()) != nonemptyMenus.end()) { ++ // if the current menu is a match already, we don't ++ // block access to the contained items ++ setItemEnabled(it.data(), true); ++ it.key()->setSearchString(QString()); ++ foundSomething = true; ++ } ++ else if (it.key()->hasSearchResults()) { ++ setItemEnabled(it.data(), true); ++ foundSomething = true; ++ } ++ else { ++ setItemEnabled(it.data(), false); ++ } ++ } ++ ++ hasSearchResults_ = foundSomething; ++} ++ ++bool PanelServiceMenu::hasSearchResults() ++{ ++ return hasSearchResults_; ++} +Index: kicker/kicker/ui/service_mnu.h +=================================================================== +--- kicker/kicker/ui/service_mnu.h.orig ++++ kicker/kicker/ui/service_mnu.h +@@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + + #include <qmap.h> + #include <qvaluevector.h> ++#include <set> + + #include <ksycocaentry.h> + #include <kservice.h> +@@ -41,8 +42,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE + * @author Rik Hemsley <rik@kde.org> + */ + ++class KLineEdit; + typedef QMap<int, KSycocaEntry::Ptr> EntryMap; + typedef QValueVector<QPopupMenu*> PopupMenuList; ++class PanelServiceMenu; ++typedef QMap<PanelServiceMenu*,int> PanelServiceMenuMap; + + class KDE_EXPORT PanelServiceMenu : public KPanelMenu + { +@@ -63,6 +67,8 @@ public: + virtual void showMenu(); + bool highlightMenuItem( const QString &menuId ); + void selectFirstItem(); ++ void setSearchString(const QString& searchString); ++ bool hasSearchResults(); + + private: + void fillMenu( KServiceGroup::Ptr &_root, KServiceGroup::List &_list, +@@ -115,6 +121,9 @@ protected: + bool addmenumode_; + QPoint startPos_; + PopupMenuList subMenus; ++ PanelServiceMenuMap searchSubMenuIDs; ++ bool hasSearchResults_; ++ std::set<int> searchMenuItems; + + private slots: + void slotContextMenu(int); diff --git a/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff b/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff new file mode 100644 index 000000000..83c771db2 --- /dev/null +++ b/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff @@ -0,0 +1,129 @@ +Index: kicker/kicker/ui/k_mnu.cpp +=================================================================== +--- kicker/kicker/ui/k_mnu.cpp.orig ++++ kicker/kicker/ui/k_mnu.cpp +@@ -771,6 +771,7 @@ void PanelKMenu::updateRecent() + insertSeparator(RecentlyLaunchedApps::the().m_nNumMenuItems); + } + } ++ iconsLoaded_ = false; + } + + void PanelKMenu::clearRecentMenuItems() +Index: kicker/kicker/ui/service_mnu.cpp +=================================================================== +--- kicker/kicker/ui/service_mnu.cpp.orig ++++ kicker/kicker/ui/service_mnu.cpp +@@ -63,13 +63,20 @@ PanelServiceMenu::PanelServiceMenu(const + insertInlineHeader_( insertInlineHeader ), + clearOnClose_(false), + addmenumode_(addmenumode), +- popupMenu_(0) ++ popupMenu_(0), ++ iconsLoaded_(false) + { + excludeNoDisplay_=true; + + connect(KSycoca::self(), SIGNAL(databaseChanged()), + SLOT(slotClearOnClose())); + connect(this, SIGNAL(aboutToHide()), this, SLOT(slotClose())); ++ ++ const int iconSize = KickerSettings::menuEntryHeight(); ++ QPixmap pix(iconSize,iconSize); ++ QBitmap map(iconSize,iconSize,true); ++ pix.setMask(map); ++ emptyiconset = QIconSet(pix,pix); + } + + PanelServiceMenu::~PanelServiceMenu() +@@ -103,6 +110,7 @@ void PanelServiceMenu::initialize() + clearSubmenus(); + searchSubMenuIDs.clear(); + searchMenuItems.clear(); ++ iconsLoaded_ = false; + doInitialize(); + } + +@@ -289,15 +297,13 @@ void PanelServiceMenu::fillMenu(KService + newSubMenu(g->name(), g->relPath(), this, g->name().utf8(), inlineHeaderName); + m->setCaption(groupCaption); + +- QIconSet iconset = KickerLib::menuIconSet(g->icon()); +- + if (separatorNeeded) + { + insertSeparator(); + separatorNeeded = false; + } + +- int newId = insertItem(iconset, groupCaption, m, id++); ++ int newId = insertItem(emptyiconset,groupCaption, m, id++); + entryMap_.insert(newId, static_cast<KSycocaEntry*>(g)); + // This submenu will be searched when applying a search string + searchSubMenuIDs[m] = newId; +@@ -392,6 +398,12 @@ void PanelServiceMenu::doInitialize() + + void PanelServiceMenu::configChanged() + { ++ const int iconSize = KickerSettings::menuEntryHeight(); ++ QPixmap pix(iconSize,iconSize); ++ QBitmap map(iconSize,iconSize,true); ++ pix.setMask(map); ++ emptyiconset = QIconSet(pix,pix); ++ + deinitialize(); + } + +@@ -456,9 +468,9 @@ void PanelServiceMenu::insertMenuItem(KS + + int newId; + if ( label.isEmpty() ) +- newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex); ++ newId = insertItem(emptyiconset, serviceName, nId, nIndex); + else +- newId = insertItem(KickerLib::menuIconSet(s->icon()), label, nId, nIndex); ++ newId = insertItem(emptyiconset, label, nId, nIndex); + entryMap_.insert(newId, static_cast<KSycocaEntry*>(s)); + } + +@@ -1003,3 +1015,23 @@ bool PanelServiceMenu::hasSearchResults( + { + return hasSearchResults_; + } ++ ++void PanelServiceMenu::slotAboutToShow() ++{ ++ KPanelMenu::slotAboutToShow(); ++ ++ if (!iconsLoaded_) { ++ EntryMap::Iterator mapIt; ++ for ( mapIt = entryMap_.begin(); mapIt != entryMap_.end(); ++mapIt ) { ++ KService *s = dynamic_cast<KService *>(static_cast<KSycocaEntry*>(mapIt.data())); ++ if (s) ++ changeItem(mapIt.key(),KickerLib::menuIconSet(s->icon()),text(mapIt.key())); ++ else { ++ KServiceGroup *g = dynamic_cast<KServiceGroup *>(static_cast<KSycocaEntry*>(mapIt.data())); ++ if (g) ++ changeItem(mapIt.key(),KickerLib::menuIconSet(g->icon()),text(mapIt.key())); ++ } ++ } ++ iconsLoaded_ = true; ++ } ++} +Index: kicker/kicker/ui/service_mnu.h +=================================================================== +--- kicker/kicker/ui/service_mnu.h.orig ++++ kicker/kicker/ui/service_mnu.h +@@ -124,9 +124,12 @@ protected: + PanelServiceMenuMap searchSubMenuIDs; + bool hasSearchResults_; + std::set<int> searchMenuItems; ++ QIconSet emptyiconset; ++ bool iconsLoaded_; + + private slots: + void slotContextMenu(int); ++ void slotAboutToShow(); + + private: + enum ContextMenuEntry { AddItemToPanel, EditItem, AddMenuToPanel, EditMenu, diff --git a/opensuse/core/tdebase/knetattach-show.diff b/opensuse/core/tdebase/knetattach-show.diff new file mode 100644 index 000000000..0f24370fd --- /dev/null +++ b/opensuse/core/tdebase/knetattach-show.diff @@ -0,0 +1,7 @@ +--- knetattach/knetattach.desktop 2008/12/02 13:49:00 1.1 ++++ knetattach/knetattach.desktop 2008/12/02 14:06:16 +@@ -80,3 +80,4 @@ + X-KDE-StartupNotify=true + Categories=Qt;KDE;Network; + DocPath=knetattach/index.html ++OnlyShowIn=KDE; diff --git a/opensuse/core/tdebase/kompmgr_use_defaults.diff b/opensuse/core/tdebase/kompmgr_use_defaults.diff new file mode 100644 index 000000000..00863fc66 --- /dev/null +++ b/opensuse/core/tdebase/kompmgr_use_defaults.diff @@ -0,0 +1,34 @@ +Index: kwin/kcmkwin/kwinoptions/windows.cpp +=================================================================== +--- kwin/kcmkwin/kwinoptions/windows.cpp.orig ++++ kwin/kcmkwin/kwinoptions/windows.cpp +@@ -46,6 +46,7 @@ + #include <kprocess.h> + #include <qtabwidget.h> + ++#include <stdlib.h> + #include <X11/X.h> + #include <X11/Xlib.h> + #include <X11/Xutil.h> +@@ -1524,6 +1525,8 @@ void KTranslucencyConfig::load( void ) + movingWindowOpacity->setEnabled(movingWindowTransparency->isChecked()); + dockWindowOpacity->setEnabled(dockWindowTransparency->isChecked()); + ++ if( !QFile::exists( QDir::homeDirPath() + "/.xcompmgrrc" )) ++ system( "/bin/cp /etc/opt/kde3/share/config/xcompmgrrc $HOME/.xcompmgrrc" ); + KConfig conf_(QDir::homeDirPath() + "/.xcompmgrrc"); + conf_.setGroup("xcompmgr"); + +Index: kwin/kompmgr/kompmgr.c +=================================================================== +--- kwin/kompmgr/kompmgr.c.orig ++++ kwin/kompmgr/kompmgr.c +@@ -2431,6 +2431,8 @@ loadConfig(char *filename){ + + strcat(filename, home); + strcat(filename, configfile); ++ if( access( filename, R_OK ) != 0 ) ++ system( "/bin/cp /etc/opt/kde3/share/config/xcompmgrrc $HOME/.xcompmgrrc" ); + } + + printf("trying '%s' as configfile\n\n", filename); diff --git a/opensuse/core/tdebase/konq-combo-editor.diff b/opensuse/core/tdebase/konq-combo-editor.diff new file mode 100644 index 000000000..8a205fb9f --- /dev/null +++ b/opensuse/core/tdebase/konq-combo-editor.diff @@ -0,0 +1,42 @@ +Index: konqueror/konq_combo.h +=================================================================== +--- konqueror/konq_combo.h.orig ++++ konqueror/konq_combo.h +@@ -87,6 +87,7 @@ signals: + + private slots: + void slotCleared(); ++ void slotRemoved( const QString& item ); + void slotSetIcon( int index ); + void slotActivated( const QString& text ); + +Index: konqueror/konq_combo.cc +=================================================================== +--- konqueror/konq_combo.cc.orig ++++ konqueror/konq_combo.cc +@@ -128,6 +128,9 @@ KonqCombo::KonqCombo( QWidget *parent, c + connect( this, SIGNAL(activated( const QString& )), + SLOT(slotActivated( const QString& )) ); + ++ setHistoryEditorEnabled( true ); ++ connect( this, SIGNAL(removed( const QString&) ), SLOT(slotRemoved( const QString& )) ); ++ + if ( !kapp->dcopClient()->isAttached() ) + kapp->dcopClient()->attach(); + } +@@ -506,6 +509,15 @@ void KonqCombo::slotCleared() + kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "comboCleared(QCString)", data); + } + ++void KonqCombo::slotRemoved( const QString& item ) ++{ ++ QByteArray data; ++ QDataStream s( data, IO_WriteOnly ); ++ s << item << kapp->dcopClient()->defaultObject(); ++ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", ++ "removeFromCombo(QString,QCString)", data); ++} ++ + void KonqCombo::removeURL( const QString& url ) + { + setUpdatesEnabled( false ); diff --git a/opensuse/core/tdebase/konsole-schema-update.diff b/opensuse/core/tdebase/konsole-schema-update.diff new file mode 100644 index 000000000..dbba940dd --- /dev/null +++ b/opensuse/core/tdebase/konsole-schema-update.diff @@ -0,0 +1,33 @@ +Index: konsole/other/BlackOnWhite.schema +=================================================================== +--- konsole/other/BlackOnWhite.schema.orig ++++ konsole/other/BlackOnWhite.schema +@@ -18,11 +18,11 @@ color 1 255 255 255 1 0 # regular b + + color 2 0 0 0 0 0 # regular color 0 Black + color 3 178 24 24 0 0 # regular color 1 Red +-color 4 24 178 24 0 0 # regular color 2 Green ++color 4 0 128 0 0 0 # regular color 2 Green + color 5 178 104 24 0 0 # regular color 3 Yellow + color 6 24 24 178 0 0 # regular color 4 Blue +-color 7 178 24 178 0 0 # regular color 5 Magenta +-color 8 24 178 178 0 0 # regular color 6 Cyan ++color 7 128 0 128 0 0 # regular color 5 Magenta ++color 8 16 128 128 0 0 # regular color 6 Cyan + color 9 178 178 178 0 0 # regular color 7 White + + # intensive colors +@@ -34,9 +34,9 @@ color 11 255 255 255 1 0 # intensive b + + color 12 104 104 104 0 0 # intensive color 0 + color 13 255 84 84 0 0 # intensive color 1 +-color 14 84 255 84 0 0 # intensive color 2 +-color 15 255 255 84 0 0 # intensive color 3 ++color 14 0 178 0 0 0 # intensive color 2 ++color 15 192 193 64 0 0 # intensive color 3 + color 16 84 84 255 0 0 # intensive color 4 +-color 17 255 84 255 0 0 # intensive color 5 +-color 18 84 255 255 0 0 # intensive color 6 ++color 17 178 0 178 0 0 # intensive color 5 ++color 18 55 178 178 0 0 # intensive color 6 + color 19 255 255 255 0 0 # intensive color 7 diff --git a/opensuse/core/tdebase/konsole_keytab.diff b/opensuse/core/tdebase/konsole_keytab.diff new file mode 100644 index 000000000..18698e2b2 --- /dev/null +++ b/opensuse/core/tdebase/konsole_keytab.diff @@ -0,0 +1,17 @@ +Index: konsole/other/x11r5.keytab +=================================================================== +--- konsole/other/x11r5.keytab.orig ++++ konsole/other/x11r5.keytab +@@ -32,10 +32,10 @@ key Left -Shift : "\EOD" + + key Enter : "\r" + +-key Home : "\E[1~" ++key Home : "\E[H" + key Insert-Shift : "\E[2~" + key Delete : "\E[3~" +-key End : "\E[4~" ++key End : "\E[F" + key Prior -Shift : "\E[5~" + key Next -Shift : "\E[6~" + diff --git a/opensuse/core/tdebase/kpamgreeter.diff b/opensuse/core/tdebase/kpamgreeter.diff new file mode 100644 index 000000000..ff8241623 --- /dev/null +++ b/opensuse/core/tdebase/kpamgreeter.diff @@ -0,0 +1,852 @@ +Index: kdm/backend/client.c +=================================================================== +--- kdm/backend/client.c.orig ++++ kdm/backend/client.c +@@ -547,6 +547,9 @@ Verify( GConvFunc gconv, int rootok ) + } else + psrv = PAMService; + pdata.usecur = TRUE; ++ } else if (!strcmp( curtype, "pam" )) { ++ psrv = PAMService; ++ pdata.usecur = FALSE; + } else { + sprintf( psrvb, "%.31s-%.31s", PAMService, curtype ); + psrv = psrvb; +@@ -616,7 +619,7 @@ Verify( GConvFunc gconv, int rootok ) + free( msg ); + V_RET_FAIL( 0 ); + } +- } else if (!strcmp( curtype, "generic" )) { ++ } else if (!strcmp( curtype, "generic" ) || !strcmp(curtype, "pam")) { + if (!gconv( GCONV_USER, 0 )) + return 0; + for (curret = 0;;) { +Index: kdm/kfrontend/themer/kdmlabel.h +=================================================================== +--- kdm/kfrontend/themer/kdmlabel.h.orig ++++ kdm/kfrontend/themer/kdmlabel.h +@@ -50,6 +50,7 @@ protected: + // handle switching between normal / active / prelight configurations + virtual void statusChanged(); + ++public: + struct LabelStruct { + QString text; + bool isTimer; +Index: kdmlib/kgreet_pam.cpp +=================================================================== +--- /dev/null ++++ kdmlib/kgreet_pam.cpp +@@ -0,0 +1,668 @@ ++/* ++ ++Conversation widget for kdm greeter ++ ++Copyright (C) 2008 Dirk Mueller <mueller@kde.org> ++ ++based on classic kdm greeter: ++ ++ Copyright (C) 1997, 1998, 2000 Steffen Hansen <hansen@kde.org> ++ Copyright (C) 2000-2003 Oswald Buddenhagen <ossi@kde.org> ++ ++ ++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 "kgreet_pam.h" ++#include "themer/kdmthemer.h" ++#include "themer/kdmlabel.h" ++ ++#include <klocale.h> ++#include <klineedit.h> ++#include <kpassdlg.h> ++#include <kuser.h> ++ ++#include <qregexp.h> ++#include <qlayout.h> ++#include <qlabel.h> ++#include <qtimer.h> ++ ++#include <stdlib.h> ++#include <stdio.h> ++#include <stdarg.h> ++#include <syslog.h> ++ ++//#define PAM_GREETER_DEBUG ++ ++class KDMPasswordEdit : public KPasswordEdit { ++public: ++ KDMPasswordEdit( QWidget *parent ) : KPasswordEdit( parent, 0 ) {} ++ KDMPasswordEdit( KPasswordEdit::EchoModes echoMode, QWidget *parent ) : KPasswordEdit( echoMode, parent, 0 ) {} ++protected: ++ virtual void contextMenuEvent( QContextMenuEvent * ) {} ++}; ++ ++static FILE* log; ++static void debug(const char* fmt, ...) ++{ ++ va_list lst; ++ va_start(lst, fmt); ++ ++#ifdef PAM_GREETER_DEBUG ++#if 0 ++ vfprintf(log, fmt, lst); ++ fflush(log); ++#else ++ char buf[6000]; ++ sprintf(buf, "*** %s\n", fmt); ++ vsyslog(LOG_WARNING, buf, lst); ++#endif ++#endif ++ va_end(lst); ++} ++ ++static KPasswordEdit::EchoModes echoMode; ++ ++KPamGreeter::KPamGreeter( KGreeterPluginHandler *_handler, ++ KdmThemer *themer, ++ QWidget *parent, QWidget *pred, ++ const QString &_fixedEntity, ++ Function _func, Context _ctx ) : ++ QObject(), ++ KGreeterPlugin( _handler ), ++ fixedUser( _fixedEntity ), ++ func( _func ), ++ ctx( _ctx ), ++ exp( -1 ), ++ pExp( -1 ), ++ running( false ) ++{ ++ ctx = Login; ++ ++ debug("KPamGreeter constructed\n"); ++ ++ m_parentWidget = parent; ++ ++ KdmItem *user_entry = 0, *pw_entry = 0; ++ int line = 0; ++ ++ layoutItem = 0; ++ ++ if (themer && ++ (!(user_entry = themer->findNode( "user-entry" )) || ++ !(pw_entry = themer->findNode( "pw-entry" )))) ++ themer = 0; ++ ++ m_themer = themer; ++ ++ if (!themer) ++ layoutItem = new QGridLayout( 0, 0, 10 ); ++ ++ loginLabel = 0; ++ authLabel.clear(); ++ authEdit.clear(); ++ loginLabel = 0; ++ loginEdit = 0; ++ if (ctx == ExUnlock || ctx == ExChangeTok) ++ fixedUser = KUser().loginName(); ++ if (func != ChAuthTok) { ++ debug("func != ChAuthTok\n"); ++ debug("fixedUser: *%s*\n", fixedUser.latin1()); ++ ++ if (fixedUser.isEmpty()) { ++ loginEdit = new KLineEdit( parent ); ++ loginEdit->setContextMenuEnabled( false ); ++ connect( loginEdit, SIGNAL(lostFocus()), SLOT(slotLoginLostFocus()) ); ++ connect( loginEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) ); ++ connect( loginEdit, SIGNAL(textChanged( const QString & )), SLOT(slotActivity()) ); ++ connect( loginEdit, SIGNAL(selectionChanged()), SLOT(slotActivity()) ); ++ if (pred) { ++ parent->setTabOrder( pred, loginEdit ); ++ pred = loginEdit; ++ } ++ if (!getLayoutItem()) { ++ loginEdit->adjustSize(); ++ user_entry->setWidget( loginEdit ); ++ } else { ++ loginLabel = new QLabel( loginEdit, i18n("Username:"), parent ); ++ getLayoutItem()->addWidget( loginLabel, line, 0 ); ++ getLayoutItem()->addWidget( loginEdit, line++, 1 ); ++ } ++ } else if (ctx != Login && ctx != Shutdown && getLayoutItem()) { ++ loginLabel = new QLabel( i18n("Username:"), parent ); ++ getLayoutItem()->addWidget( loginLabel, line, 0 ); ++ getLayoutItem()->addWidget( new QLabel( fixedUser, parent ), line++, 1 ); ++ } ++#if 0 ++ if (echoMode == -1) ++ passwdEdit = new KDMPasswordEdit( parent ); ++ else ++ passwdEdit = new KDMPasswordEdit( echoMode, ++ parent ); ++ connect( passwdEdit, SIGNAL(textChanged( const QString & )), ++ SLOT(slotActivity()) ); ++ connect( passwdEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) ); ++ if (pred) { ++ parent->setTabOrder( pred, passwdEdit ); ++ pred = passwdEdit; ++ } ++ if (!getLayoutItem()) { ++ passwdEdit->adjustSize(); ++ pw_entry->setWidget( passwdEdit ); ++ } else { ++ passwdLabel = new QLabel( passwdEdit, ++ func == Authenticate ? ++ i18n("hello &Password:") : ++ i18n("Current &password:"), ++ parent ); ++ getLayoutItem()->addWidget( passwdLabel, line, 0 ); ++ getLayoutItem()->addWidget( passwdEdit, line++, 1 ); ++ } ++#endif ++ if (loginEdit) ++ loginEdit->setFocus(); ++ } ++ if (func != Authenticate) { ++ if (echoMode == -1) { ++ authEdit << new KDMPasswordEdit( echoMode, parent ); ++ authEdit << new KDMPasswordEdit( echoMode, parent ); ++ } else { ++ authEdit << new KDMPasswordEdit( parent ); ++ authEdit << new KDMPasswordEdit( parent ); ++ } ++ authLabel << new QLabel( authEdit[0], i18n("&New password:"), parent ); ++ authLabel << new QLabel( authEdit[1], i18n("Con&firm password:"), parent ); ++ if (pred) { ++ parent->setTabOrder( pred, authEdit[0] ); ++ parent->setTabOrder( authEdit[0], authEdit[1] ); ++ } ++ if (getLayoutItem()) { ++ getLayoutItem()->addWidget( authLabel[0], line, 0 ); ++ getLayoutItem()->addWidget( authEdit[0], line++, 1 ); ++ getLayoutItem()->addWidget( authLabel[1], line, 0 ); ++ getLayoutItem()->addWidget( authEdit[1], line, 1 ); ++ } ++ if (authEdit.size() >= 2) ++ authEdit[1]->setFocus(); ++ } ++} ++ ++// virtual ++KPamGreeter::~KPamGreeter() ++{ ++ debug("KPamGreeter::~KPamGreeter"); ++ abort(); ++ if (!layoutItem) { ++ delete loginEdit; ++ return; ++ } ++ QLayoutIterator it = static_cast<QLayout *>(layoutItem)->iterator(); ++ for (QLayoutItem *itm = it.current(); itm; itm = ++it) ++ delete itm->widget(); ++ delete layoutItem; ++ debug("destructor finished, good bye"); ++} ++ ++void // virtual ++KPamGreeter::loadUsers( const QStringList &users ) ++{ ++ KCompletion *userNamesCompletion = new KCompletion; ++ userNamesCompletion->setItems( users ); ++ loginEdit->setCompletionObject( userNamesCompletion ); ++ loginEdit->setAutoDeleteCompletionObject( true ); ++ loginEdit->setCompletionMode( KGlobalSettings::CompletionAuto ); ++} ++ ++void // virtual ++KPamGreeter::presetEntity( const QString &entity, int field ) ++{ ++ debug("presetEntity(%s,%d) called!\n", entity.latin1(), field); ++ loginEdit->setText( entity ); ++ if (field == 1 && authEdit.size() >= 1) ++ authEdit[0]->setFocus(); ++ else { ++ loginEdit->setFocus(); ++ loginEdit->selectAll(); ++ if (field == -1 && authEdit.size() >= 1) { ++ authEdit[0]->setText( " " ); ++ authEdit[0]->setEnabled( false ); ++ authTok = false; ++ } ++ } ++ curUser = entity; ++} ++ ++QString // virtual ++KPamGreeter::getEntity() const ++{ ++ return fixedUser.isEmpty() ? loginEdit->text() : fixedUser; ++} ++ ++void // virtual ++KPamGreeter::setUser( const QString &user ) ++{ ++ // assert( fixedUser.isEmpty() ); ++ curUser = user; ++ loginEdit->setText( user ); ++ if (authEdit.size() >= 1) { ++ authEdit[0]->setFocus(); ++ authEdit[0]->selectAll(); ++ } ++} ++ ++void // virtual ++KPamGreeter::setEnabled(bool enable) ++{ ++ // assert( !passwd1Label ); ++ // assert( func == Authenticate && ctx == Shutdown ); ++// if (loginLabel) ++// loginLabel->setEnabled( enable ); ++ authEdit[0]->setEnabled( enable ); ++ setActive( enable ); ++ if (enable) ++ authEdit[0]->setFocus(); ++ } ++ ++void // private ++KPamGreeter::returnData() ++{ ++ debug("*************** returnData called with exp %d\n", exp); ++ ++ ++ switch (exp) { ++ case 0: ++ handler->gplugReturnText( (loginEdit ? loginEdit->text() : ++ fixedUser).local8Bit(), ++ KGreeterPluginHandler::IsUser ); ++ break; ++ case 1: ++ handler->gplugReturnText( authEdit[0]->password(), ++ KGreeterPluginHandler::IsPassword | ++ KGreeterPluginHandler::IsSecret ); ++ break; ++ case 2: ++ handler->gplugReturnText( authEdit[1]->password(), ++ KGreeterPluginHandler::IsSecret ); ++ break; ++ default: // case 3: ++ handler->gplugReturnText( authEdit[2]->password(), ++ KGreeterPluginHandler::IsNewPassword | ++ KGreeterPluginHandler::IsSecret ); ++ break; ++ } ++} ++ ++bool // virtual ++KPamGreeter::textMessage( const char *text, bool err ) ++{ ++ debug(" ************** textMessage(%s, %d)\n", text, err); ++ ++ if (!authEdit.size()) ++ return false; ++ ++ if (getLayoutItem()) { ++ QLabel* label = new QLabel(QString::fromUtf8(text), m_parentWidget); ++ getLayoutItem()->addWidget(label, state+1, 0, 0); ++ } ++ ++ return true; ++} ++ ++void // virtual ++KPamGreeter::textPrompt( const char *prompt, bool echo, bool nonBlocking ) ++{ ++ debug("textPrompt called with prompt %s echo %d nonBlocking %d", prompt, echo, nonBlocking); ++ debug("state is %d, authEdit.size is %d\n", state, authEdit.size()); ++ ++ if (state == 0 && echo) { ++ if (loginLabel) ++ loginLabel->setText(QString::fromUtf8(prompt)); ++ else if (m_themer) { ++ KdmLabel *kdmlabel = static_cast<KdmLabel*>(m_themer->findNode("user-label")); ++ if (kdmlabel) { ++ //userLabel->setText(QString::fromUtf8(prompt)); ++ kdmlabel->label.text = QString::fromUtf8(prompt); ++ QTimer::singleShot(0, kdmlabel, SLOT(update())); ++ } ++ } ++ } ++ else if (state >= authEdit.size()) { ++ if (getLayoutItem()) { ++ QLabel* label = new QLabel(QString::fromUtf8(prompt), m_parentWidget); ++ getLayoutItem()->addWidget(label, state+1, 0, 0); ++ debug("added label widget to layout"); ++ } ++ else if (m_themer) { ++ debug("themer found!"); ++ KdmItem *pw_label = 0; ++ ++ KdmLabel *kdmlabel = static_cast<KdmLabel*>(m_themer->findNode("pw-label")); ++ if (kdmlabel) { ++ //userLabel->setText(QString::fromUtf8(prompt)); ++ QString str = QString::fromUtf8(prompt); ++ kdmlabel->label.text = str; ++ QTimer::singleShot(0, kdmlabel, SLOT(update())); ++ } ++ } ++ ++ KDMPasswordEdit* passwdEdit; ++ ++ if (echoMode == -1) ++ passwdEdit = new KDMPasswordEdit( m_parentWidget ); ++ else ++ passwdEdit = new KDMPasswordEdit( echoMode, m_parentWidget); ++ connect( passwdEdit, SIGNAL(textChanged( const QString & )), ++ SLOT(slotActivity()) ); ++ connect( passwdEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) ); ++ authEdit << passwdEdit; ++ ++#if 1 ++ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin(); ++ it != authEdit.end(); ++ ++it) { ++ if ((*it)->isEnabled() && (*it)->text().isEmpty()) { ++ (*it)->setFocus(); ++ break; ++ } ++ } ++#endif ++ if (getLayoutItem()) ++ getLayoutItem()->addWidget(passwdEdit, state+1, 1, 0); ++ ++ if (m_themer) { ++ debug("themer found!"); ++ KdmItem *pw_entry = 0; ++ ++ pw_entry = m_themer->findNode("pw-entry"); ++ ++ if (pw_entry && passwdEdit) ++ pw_entry->setWidget(passwdEdit); ++ ++ if (0) { ++ //userLabel->setText(QString::fromUtf8(prompt)); ++ //kdmlabel->label.text = QString::fromUtf8(prompt); ++ //QTimer::singleShot(0, kdmlabel, SLOT(update())); ++ } ++ } ++ else ++ debug("no themer found!"); ++ } ++ ++state; ++ pExp = exp; ++ ++ exp = authEdit.size(); ++ debug("state %d exp: %d, has %d\n", state, exp, has); ++ ++ if (has >= exp || nonBlocking) ++ returnData(); ++} ++ ++bool // virtual ++KPamGreeter::binaryPrompt( const char *, bool ) ++{ ++ // this simply cannot happen ... :} ++ return true; ++} ++ ++void // virtual ++KPamGreeter::start() ++{ ++ debug("******* start() called\n"); ++ ++ while(authEdit.begin() != authEdit.end()) { ++ KPasswordEdit* item = *authEdit.remove(authEdit.begin()); ++ delete item; ++ } ++ ++ while(authLabel.begin() != authLabel.end()) { ++ QLabel* item = *authLabel.remove(authLabel.begin()); ++ delete item; ++ } ++ ++ authTok = !(authEdit.size() >= 2 && authEdit[1]->isEnabled()); ++ exp = has = -1; ++ state = 0; ++ running = true; ++ handler->gplugStart(); ++} ++ ++void // virtual ++KPamGreeter::suspend() ++{ ++} ++ ++void // virtual ++KPamGreeter::resume() ++{ ++} ++ ++void // virtual ++KPamGreeter::next() ++{ ++ debug("********* next() called state %d\n", state); ++ ++ if (state == 0 && running && handler) { ++ debug(" **** returned text!\n"); ++ handler->gplugReturnText( (loginEdit ? loginEdit->text() : ++ fixedUser).local8Bit(), ++ KGreeterPluginHandler::IsUser ); ++ setActive(false); ++ } ++ ++ has = 0; ++ ++ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin(); ++ it != authEdit.end(); ++ ++it) { ++ ++ has++; ++ if ((*it)->hasFocus()) { ++ ++it; ++ if (it != authEdit.end()) ++ (*it)->setFocus(); ++ break; ++ } ++ if (it == authEdit.end()) ++ has = -1; ++ } ++ ++ debug(" has %d and exp %d\n", has, exp); ++ ++#if 0 ++ // assert( running ); ++ if (loginEdit && loginEdit->hasFocus()) { ++ passwdEdit->setFocus(); // will cancel running login if necessary ++ has = 0; ++ } else if (passwdEdit && passwdEdit->hasFocus()) { ++ if (passwd1Edit) ++ passwd1Edit->setFocus(); ++ has = 1; ++ } else if (passwd1Edit) { ++ if (passwd1Edit->hasFocus()) { ++ passwd2Edit->setFocus(); ++ has = 1; // sic! ++ } else ++ has = 3; ++ } else ++ has = 1; ++ if (exp < 0) ++ handler->gplugStart(); ++#endif ++ if (has >= exp) ++ returnData(); ++} ++ ++void // virtual ++KPamGreeter::abort() ++{ ++ debug("***** abort() called\n"); ++ ++ running = false; ++ if (exp >= 0) { ++ exp = -1; ++ handler->gplugReturnText( 0, 0 ); ++ } ++} ++ ++void // virtual ++KPamGreeter::succeeded() ++{ ++ debug("**** succeeded() called\n"); ++ ++ // assert( running || timed_login ); ++ if (!authTok) ++ setActive( false ); ++ else ++ setAllActive( false ); ++ exp = -1; ++ running = false; ++} ++ ++void // virtual ++KPamGreeter::failed() ++{ ++ // assert( running || timed_login ); ++ setActive( false ); ++ setAllActive( false ); ++ exp = -1; ++ running = false; ++} ++ ++#include<assert.h> ++void // virtual ++KPamGreeter::revive() ++{ ++ // assert( !running ); ++ setAllActive( true ); ++ ++#if 1 ++ if (authEdit.size() < 1) ++ return; ++#endif ++ ++ assert(authEdit.size() >= 1); ++ if (authTok) { ++ authEdit[0]->erase(); ++ if(authEdit.size() >= 2) ++ authEdit[1]->erase(); ++ authEdit[0]->setFocus(); ++ } else { ++ authEdit[0]->erase(); ++ if (loginEdit && loginEdit->isEnabled()) ++ authEdit[0]->setEnabled( true ); ++ else { ++ setActive( true ); ++ if (loginEdit && loginEdit->text().isEmpty()) ++ loginEdit->setFocus(); ++ else ++ authEdit[0]->setFocus(); ++ } ++ } ++} ++ ++void // virtual ++KPamGreeter::clear() ++{ ++ // assert( !running && !passwd1Edit ); ++ authEdit[0]->erase(); ++ if (loginEdit) { ++ loginEdit->clear(); ++ loginEdit->setFocus(); ++ curUser = QString::null; ++ } else ++ authEdit[0]->setFocus(); ++} ++ ++ ++// private ++ ++void ++KPamGreeter::setActive( bool enable ) ++{ ++ if (loginEdit) ++ loginEdit->setEnabled( enable ); ++} ++ ++void ++KPamGreeter::setAllActive( bool enable ) ++{ ++ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin(); ++ it != authEdit.end(); ++ ++it) ++ (*it)->setEnabled( enable ); ++} ++ ++void ++KPamGreeter::slotLoginLostFocus() ++{ ++ if (!running) ++ return; ++ if (exp > 0) { ++ if (curUser == loginEdit->text()) ++ return; ++ exp = -1; ++ handler->gplugReturnText( 0, 0 ); ++ } ++ curUser = loginEdit->text(); ++ debug("curUser is %s", curUser.latin1()); ++ handler->gplugSetUser( curUser ); ++} ++ ++void ++KPamGreeter::slotActivity() ++{ ++ debug("slotActivity"); ++ ++ if (running) ++ handler->gplugActivity(); ++} ++ ++// factory ++ ++static bool init( const QString &, ++ QVariant (*getConf)( void *, const char *, const QVariant & ), ++ void *ctx ) ++{ ++ echoMode = (KPasswordEdit::EchoModes) getConf( ctx, "EchoMode", QVariant( -1 ) ).toInt(); ++ KGlobal::locale()->insertCatalogue( "kgreet_pam" ); ++ return true; ++} ++ ++static void done( void ) ++{ ++ KGlobal::locale()->removeCatalogue( "kgreet_pam" ); ++ if (log && log != stderr) ++ fclose(log); ++ log = 0; ++} ++ ++static KGreeterPlugin * ++create( KGreeterPluginHandler *handler, KdmThemer *themer, ++ QWidget *parent, QWidget *predecessor, ++ const QString &fixedEntity, ++ KGreeterPlugin::Function func, ++ KGreeterPlugin::Context ctx ) ++{ ++ return new KPamGreeter( handler, themer, parent, predecessor, fixedEntity, func, ctx ); ++} ++ ++KDE_EXPORT kgreeterplugin_info kgreeterplugin_info = { ++ I18N_NOOP("Pam conversation plugin"), "pam", ++ kgreeterplugin_info::Local | kgreeterplugin_info::Presettable, ++ init, done, create ++}; ++ ++#include "kgreet_pam.moc" +Index: kdmlib/kgreet_pam.h +=================================================================== +--- /dev/null ++++ kdmlib/kgreet_pam.h +@@ -0,0 +1,93 @@ ++/* ++ ++Conversation widget for kdm greeter ++ ++Copyright (C) 2008 Dirk Mueller <mueller@kde.org> ++ ++ ++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. ++ ++*/ ++ ++ ++#ifndef KGREET_CLASSIC_H ++#define KGREET_CLASSIC_H ++ ++#include "kgreeterplugin.h" ++ ++#include <qobject.h> ++#include <qlayout.h> ++ ++class KLineEdit; ++class KPasswordEdit; ++class KSimpleConfig; ++class QGridLayout; ++class QLabel; ++ ++class KPamGreeter : public QObject, public KGreeterPlugin { ++ Q_OBJECT ++ ++ public: ++ KPamGreeter( KGreeterPluginHandler *handler, ++ KdmThemer *themer, ++ QWidget *parent, QWidget *predecessor, ++ const QString &fixedEntitiy, ++ Function func, Context ctx ); ++ ~KPamGreeter(); ++ virtual void loadUsers( const QStringList &users ); ++ virtual void presetEntity( const QString &entity, int field ); ++ virtual QString getEntity() const; ++ virtual void setUser( const QString &user ); ++ virtual void setEnabled( bool on ); ++ virtual bool textMessage( const char *message, bool error ); ++ virtual void textPrompt( const char *prompt, bool echo, bool nonBlocking ); ++ virtual bool binaryPrompt( const char *prompt, bool nonBlocking ); ++ virtual void start(); ++ virtual void suspend(); ++ virtual void resume(); ++ virtual void next(); ++ virtual void abort(); ++ virtual void succeeded(); ++ virtual void failed(); ++ virtual void revive(); ++ virtual void clear(); ++ ++ QGridLayout *getLayoutItem() const { return static_cast<QGridLayout*>(layoutItem); } ++ ++ public slots: ++ void slotLoginLostFocus(); ++ void slotActivity(); ++ ++ private: ++ void setActive( bool enable ); ++ void setAllActive( bool enable ); ++ void returnData(); ++ ++ QLabel *loginLabel; ++ QValueList<QLabel*> authLabel; ++ KLineEdit *loginEdit; ++ QWidget* m_parentWidget; ++ QValueList<KPasswordEdit*> authEdit; ++ KSimpleConfig *stsFile; ++ KdmThemer *m_themer; ++ QString fixedUser, curUser; ++ Function func; ++ Context ctx; ++ int exp, pExp, has; ++ unsigned state; ++ bool running, authTok; ++}; ++ ++#endif /* KGREET_CLASSIC_H */ +Index: kdmlib/Makefile.am +=================================================================== +--- kdmlib/Makefile.am.orig ++++ kdmlib/Makefile.am +@@ -1,11 +1,15 @@ + AM_CPPFLAGS = -I$(top_srcdir)/kdm/kfrontend $(all_includes) + +-kde_module_LTLIBRARIES = kgreet_classic.la kgreet_winbind.la ++kde_module_LTLIBRARIES = kgreet_classic.la kgreet_pam.la kgreet_winbind.la + + kgreet_classic_la_SOURCES = kgreet_classic.cpp + kgreet_classic_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) + kgreet_classic_la_LIBADD = $(LIB_KDEUI) + ++kgreet_pam_la_SOURCES = kgreet_pam.cpp ++kgreet_pam_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) ++kgreet_pam_la_LIBADD = $(LIB_KDEUI) ++ + kgreet_winbind_la_SOURCES = kgreet_winbind.cpp + kgreet_winbind_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries) + kgreet_winbind_la_LIBADD = $(LIB_KDEUI) +Index: kcheckpass/checkpass_pam.c +=================================================================== +--- kcheckpass/checkpass_pam.c.orig ++++ kcheckpass/checkpass_pam.c +@@ -140,13 +140,16 @@ AuthReturn Authenticate(const char *call + openlog("kcheckpass", LOG_PID, LOG_AUTH); + + PAM_data.conv = conv; +- if (strcmp(method, "classic")) { +- sprintf(pservb, "%.31s-%.31s", caller, method); +- pam_service = pservb; +- } else { ++ if (!strcmp(method, "classic")) { + PAM_data.classic = 1; + pam_service = caller; + } ++ else if (!strcmp(method, "pam")) { ++ pam_service = caller; ++ } else { ++ sprintf(pservb, "%.31s-%.31s", caller, method); ++ pam_service = pservb; ++ } + pam_error = pam_start(pam_service, user, &PAM_conversation, &pamh); + if (pam_error != PAM_SUCCESS) + return AuthError; diff --git a/opensuse/core/tdebase/krandr-0.5.2.1.diff.bz2 b/opensuse/core/tdebase/krandr-0.5.2.1.diff.bz2 Binary files differnew file mode 100644 index 000000000..5e35b382b --- /dev/null +++ b/opensuse/core/tdebase/krandr-0.5.2.1.diff.bz2 diff --git a/opensuse/core/tdebase/kscreensaver-random-NG.diff b/opensuse/core/tdebase/kscreensaver-random-NG.diff new file mode 100644 index 000000000..389babf13 --- /dev/null +++ b/opensuse/core/tdebase/kscreensaver-random-NG.diff @@ -0,0 +1,189 @@ +Index: kscreensaver/random.cpp +=================================================================== +--- kscreensaver/random.cpp.orig ++++ kscreensaver/random.cpp +@@ -1,4 +1,4 @@ +-//----------------------------------------------------------------------------- ++ //----------------------------------------------------------------------------- + // + // Screen savers for KDE + // +@@ -19,6 +19,7 @@ + #include <qframe.h> + #include <qcheckbox.h> + #include <qwidget.h> ++#include <qfileinfo.h> + + #include <kapplication.h> + #include <kstandarddirs.h> +@@ -36,7 +37,7 @@ + + #define MAX_ARGS 20 + +-void usage(char *name) ++static void usage(char *name) + { + puts(i18n("Usage: %1 [-setup] [args]\n" + "Starts a random screen saver.\n" +@@ -60,6 +61,43 @@ static const KCmdLineOptions options[] = + + //---------------------------------------------------------------------------- + ++#ifdef HAVE_GLXCHOOSEVISUAL ++#include <GL/glx.h> ++#endif ++ ++//------------------------------------- ++bool hasDirectRendering () { ++ Display *dpy = QApplication::desktop()->x11Display(); ++ ++#ifdef HAVE_GLXCHOOSEVISUAL ++ int attribSingle[] = { ++ GLX_RGBA, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ None ++ }; ++ XVisualInfo* visinfo = glXChooseVisual ( ++ dpy, QApplication::desktop()->primaryScreen(), attribSingle ++ ); ++ if (visinfo) { ++ GLXContext ctx = glXCreateContext ( dpy, visinfo, NULL, True ); ++ if (glXIsDirect(dpy, ctx)) { ++ glXDestroyContext (dpy,ctx); ++ return true; ++ } ++ glXDestroyContext (dpy,ctx); ++ return false; ++ } else { ++ return false; ++ } ++#else ++#error no GL? ++ return false; ++#endif ++ ++} ++ + int main(int argc, char *argv[]) + { + KLocale::setMainCatalogue("kscreensaver"); +@@ -103,55 +141,63 @@ int main(int argc, char *argv[]) + + KConfig type("krandom.kssrc"); + type.setGroup("Settings"); +- bool opengl = type.readBoolEntry("OpenGL"); ++ bool opengl = type.readBoolEntry("OpenGL", hasDirectRendering()); ++ kdDebug() << "hasOPEN " << opengl << endl; + bool manipulatescreen = type.readBoolEntry("ManipulateScreen"); + bool fortune = !KStandardDirs::findExe("fortune").isEmpty(); ++ QStringList defaults = type.readListEntry( "Defaults" ); ++ QMap<QString, int> def_numbers; ++ for ( QStringList::ConstIterator it = defaults.begin(); it != defaults.end(); ++it ) { ++ int index = ( *it ).find( ':' ); ++ if ( index == -1 ) ++ def_numbers[*it] = 1; ++ else ++ def_numbers[( *it ).left( index )] = ( *it ).mid( index + 1 ).toInt(); ++ } + + for (uint i = 0; i < tempSaverFileList.count(); i++) + { +- kdDebug() << "Looking at " << tempSaverFileList[i] << endl; ++ int howoften = 1; ++ if ( defaults.count() != 0 ) { ++ QFileInfo fi( tempSaverFileList[i] ); ++ if ( def_numbers.contains( fi.fileName() ) ) ++ howoften = def_numbers[fi.fileName()]; ++ else ++ howoften = 0; ++ } ++ + KDesktopFile saver(tempSaverFileList[i], true); +- if(!saver.tryExec()) +- continue; +- kdDebug() << "read X-KDE-Type" << endl; ++ if (!saver.tryExec()) ++ continue; + QString saverType = saver.readEntry("X-KDE-Type"); +- +- if (saverType.isEmpty()) // no X-KDE-Type defined so must be OK +- { +- saverFileList.append(tempSaverFileList[i]); +- } +- else +- { ++ if (!saverType.isEmpty()) // no X-KDE-Type defined so must be OK ++ { + QStringList saverTypes = QStringList::split(";", saverType); + for (QStringList::ConstIterator it = saverTypes.begin(); it != saverTypes.end(); ++it ) + { +- kdDebug() << "saverTypes is "<< *it << endl; + if (*it == "ManipulateScreen") + { +- if (manipulatescreen) +- { +- saverFileList.append(tempSaverFileList[i]); +- } ++ if (!manipulatescreen) ++ howoften = 0; + } + else + if (*it == "OpenGL") + { +- if (opengl) +- { +- saverFileList.append(tempSaverFileList[i]); +- } ++ if (!opengl) ++ howoften = 0; + } + if (*it == "Fortune") + { +- if (fortune) +- { +- saverFileList.append(tempSaverFileList[i]); +- } ++ if (!fortune) ++ howoften = 0; + } + + } + } ++ for ( int j = 0; j < howoften; ++j ) ++ saverFileList.append(tempSaverFileList[i]); + } ++ kdDebug() << "final " << saverFileList << endl; + + KRandomSequence rnd; + int indx = rnd.getLong(saverFileList.count()); +@@ -229,7 +275,7 @@ KRandomSetup::KRandomSetup( QWidget *par + + KConfig config("krandom.kssrc"); + config.setGroup("Settings"); +- openGL->setChecked(config.readBoolEntry("OpenGL", true)); ++ openGL->setChecked(config.readBoolEntry("OpenGL", hasDirectRendering())); + manipulateScreen->setChecked(config.readBoolEntry("ManipulateScreen", true)); + } + +Index: kscreensaver/Makefile.am +=================================================================== +--- kscreensaver/Makefile.am.orig ++++ kscreensaver/Makefile.am +@@ -3,13 +3,13 @@ + + AM_CPPFLAGS = -UQT_NO_ASCII_CAST + +-INCLUDES = $(all_includes) ++INCLUDES = $(GLINC) $(all_includes) + AM_LDFLAGS = $(all_libraries) $(KDE_RPATH) + + bin_PROGRAMS = krandom.kss kblankscrn.kss + + krandom_kss_SOURCES = random.cpp +-krandom_kss_LDADD = $(LIB_KDEUI) -lm ++krandom_kss_LDADD = $(LIB_KDEUI) $(GLLIB) -lm + + kblankscrn_kss_SOURCES = blankscrn.cpp + kblankscrn_kss_LDADD = $(LIB_KDEUI) -lkscreensaver -lm diff --git a/opensuse/core/tdebase/ksmserver-defaulttohalt.diff b/opensuse/core/tdebase/ksmserver-defaulttohalt.diff new file mode 100644 index 000000000..71a8a5037 --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-defaulttohalt.diff @@ -0,0 +1,13 @@ +Index: ksmserver/shutdowndlg.cpp +=================================================================== +--- ksmserver/shutdowndlg.cpp.orig ++++ ksmserver/shutdowndlg.cpp +@@ -222,7 +222,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + btnHalt->setFont( btnFont ); + buttonlay->addWidget( btnHalt ); + connect(btnHalt, SIGNAL(clicked()), SLOT(slotHalt())); +- if ( sdtype == KApplication::ShutdownTypeHalt ) ++ if ( sdtype == KApplication::ShutdownTypeHalt || getenv("KDM_AUTOLOGIN") ) + btnHalt->setFocus(); + + // Reboot diff --git a/opensuse/core/tdebase/ksmserver-kdeinit.diff b/opensuse/core/tdebase/ksmserver-kdeinit.diff new file mode 100644 index 000000000..a21b92dc8 --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-kdeinit.diff @@ -0,0 +1,67 @@ +--- ksmserver/server.h.sav 2009-07-23 11:44:55.000000000 +0200 ++++ ksmserver/server.h 2009-07-23 11:47:52.000000000 +0200 +@@ -145,7 +145,8 @@ private: + + KProcess* startApplication( QStringList command, + const QString& clientMachine = QString::null, +- const QString& userId = QString::null ); ++ const QString& userId = QString::null, ++ bool wm = false ); + void executeCommand( const QStringList& command ); + + bool isWM( const KSMClient* client ) const; +--- ksmserver/startup.cpp.sav 2009-07-23 11:44:54.000000000 +0200 ++++ ksmserver/startup.cpp 2009-07-23 11:45:49.000000000 +0200 +@@ -168,7 +168,7 @@ void KSMServer::launchWM( const QValueLi + // when we have a window manager, we start it first and give + // it some time before launching other processes. Results in a + // visually more appealing startup. +- wmProcess = startApplication( wmStartCommands[ 0 ] ); ++ wmProcess = startApplication( wmStartCommands[ 0 ], QString(), QString(), true ); + connect( wmProcess, SIGNAL( processExited( KProcess* )), SLOT( wmProcessChange())); + // there can be possibly more wm's (because of forking for multihead), + // but in such case care only about the process of the first one +--- ksmserver/server.cpp.sav 2009-07-23 11:51:33.000000000 +0200 ++++ ksmserver/server.cpp 2009-07-23 11:49:02.000000000 +0200 +@@ -101,7 +101,7 @@ KSMServer* KSMServer::self() + * to restart applications. + */ + KProcess* KSMServer::startApplication( QStringList command, const QString& clientMachine, +- const QString& userId ) ++ const QString& userId, bool wm ) + { + if ( command.isEmpty() ) + return NULL; +@@ -118,12 +118,26 @@ KProcess* KSMServer::startApplication( Q + command.prepend( clientMachine ); + command.prepend( xonCommand ); // "xon" by default + } +- KProcess* process = new KProcess( this ); +- *process << command; +- // make it auto-delete +- connect( process, SIGNAL( processExited( KProcess* )), process, SLOT( deleteLater())); +- process->start(); +- return process; ++// TODO this function actually should not use KProcess at all and use klauncher (kdeinit) instead. ++// Klauncher should also have support for tracking whether the launched process is still alive ++// or not, so this should be redone. For now, use KProcess for wm's, as they need to be tracked, ++// klauncher for the rest where ksmserver doesn't care. ++ if( wm ) { ++ KProcess* process = new KProcess( this ); ++ *process << command; ++ // make it auto-delete ++ connect( process, SIGNAL( processExited( KProcess* )), process, SLOT( deleteLater())); ++ process->start(); ++ return process; ++ } else { ++ int n = command.count(); ++ QCString app = command[0].latin1(); ++ QValueList<QCString> argList; ++ for ( int i=1; i < n; i++) ++ argList.append( QCString(command[i].latin1())); ++ DCOPRef( launcher ).send( "exec_blind", app, DCOPArg( argList, "QValueList<QCString>" ) ); ++ return NULL; ++ } + } + + /*! Utility function to execute a command on the local machine. Used diff --git a/opensuse/core/tdebase/ksmserver-suspend.diff b/opensuse/core/tdebase/ksmserver-suspend.diff new file mode 100644 index 000000000..ef7a88036 --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-suspend.diff @@ -0,0 +1,233 @@ +Index: ksmserver/Makefile.am +=================================================================== +--- ksmserver/Makefile.am.orig ++++ ksmserver/Makefile.am +@@ -17,7 +17,7 @@ + + SUBDIRS = . + +-INCLUDES= -I$(top_srcdir)/kdmlib $(all_includes) ++INCLUDES= -I$(top_srcdir)/kdmlib $(all_includes) $(DBUS_INCS) + + bin_PROGRAMS = + lib_LTLIBRARIES = +@@ -31,7 +31,7 @@ ksmserver_la_SOURCES = main.cpp server.c + KSMServerInterface.skel server.skel + + ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module +-ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) ++ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) -llazy $(DBUS_LIBS) + + picsdir = $(kde_datadir)/ksmserver/pics + pics_DATA = shutdownkonq.png +@@ -44,7 +44,7 @@ updatedir = $(kde_datadir)/kconf_update + EXTRA_PROGRAMS = testsh + testsh_SOURCES = test.cpp + testsh_LDFLAGS = $(all_libraries) $(KDE_RPATH) +-testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la ++testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la -llazy $(DBUS_LIBS) + + messages: + $(XGETTEXT) *.cpp -o $(podir)/ksmserver.pot +Index: ksmserver/shutdowndlg.cpp +=================================================================== +--- ksmserver/shutdowndlg.cpp.orig ++++ ksmserver/shutdowndlg.cpp +@@ -38,17 +38,23 @@ Copyright (C) 2000 Matthias Ettrich <ett + #include <kpixmapeffect.h> + #include <kdialog.h> + #include <kseparator.h> ++#include <kmessagebox.h> + + #include <sys/types.h> + #include <sys/utsname.h> + #include <unistd.h> + #include <stdlib.h> + #include <dmctl.h> ++#include <liblazy.h> + + #include <X11/Xlib.h> + + #include "shutdowndlg.moc" + ++#define DBUS_HAL_INTERFACE "org.freedesktop.Hal" ++#define DBUS_HAL_SYSTEM_POWER_INTERFACE "org.freedesktop.Hal.Device.SystemPowerManagement" ++#define HAL_UDI_COMPUTER "/org/freedesktop/Hal/devices/computer" ++ + static const int max_faded = 2300; + static const int slice = 20; + +@@ -215,8 +221,8 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout())); + + if (maysd) { +- +- // Shutdown ++ ++ // Shutdown + KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame ); + QToolTip::add( btnHalt, i18n( "<qt><h3>Turn Off Computer</h3><p>Log out of the current session and turn off the computer</p></qt>" ) ); + btnHalt->setFont( btnFont ); +@@ -251,13 +257,58 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + else + targets->insertItem( label, index ); + } +- ++ + btnReboot->setPopup(targets); + connect( targets, SIGNAL(activated(int)), SLOT(slotReboot(int)) ); + } else + QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p></qt>" ) ); +- } + ++ int supported = -1; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); ++ if (supported == 1) ++ suspend_ram = true; ++ else ++ suspend_ram = false; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_standby", &supported); ++ if (supported == 1) ++ standby = true; ++ else ++ standby = false; ++ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_hibernate", &supported); ++ if (supported == 1) ++ suspend_disk = true; ++ else ++ suspend_disk = false; ++ ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.hibernate") != 1) ++ suspend_disk = false; ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.suspend") != 1) ++ suspend_ram = false; ++ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1) ++ standby = false; ++ ++ int sum = standby + suspend_ram + suspend_disk; ++ if ( sum ) { ++ QButton *btnSuspend; ++ if (sum > 1) { ++ btnSuspend = new KSMDelayedPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), frame ); ++ QPopupMenu *suspends = new QPopupMenu(frame); ++ if (suspend_disk) ++ suspends->insertItem(i18n("Suspend to Disk"), 1); ++ if (suspend_ram) ++ suspends->insertItem(i18n("Suspend to RAM"), 2); ++ if (standby) ++ suspends->insertItem(i18n("Standby"), 3); ++ connect(suspends, SIGNAL(activated(int)), SLOT(slotSuspend(int))); ++ static_cast<KSMDelayedPushButton*>(btnSuspend)->setPopup(suspends); ++ } else { ++ btnSuspend = new KPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), frame ); ++ } ++ btnSuspend->setFont( btnFont ); ++ buttonlay->addWidget( btnSuspend ); ++ connect(btnSuspend, SIGNAL(clicked()), SLOT(slotSuspend())); ++ } ++ } + buttonlay->addStretch( 1 ); + + // Separator +@@ -270,6 +321,80 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + + } + ++void KSMShutdownDlg::slotSuspend() ++{ ++ int error = 0; ++ int wake = 0; ++ DBusMessage *reply; ++ ++ if (suspend_disk) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Hibernate", ++ &reply, ++ DBUS_TYPE_INVALID); ++ else if (suspend_ram) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Suspend", ++ &reply, ++ DBUS_TYPE_INT32, ++ &wake, ++ DBUS_TYPE_INVALID); ++ else ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Standby", ++ &reply, ++ DBUS_TYPE_INVALID); ++ ++ if (error) ++ KMessageBox::error(this, i18n("Suspend failed")); ++ ++ // possibly after resume :) ++ reject(); ++} ++ ++void KSMShutdownDlg::slotSuspend(int id) ++{ ++ int error = 0; ++ int wake = 0; ++ DBusMessage *reply; ++ ++ if (suspend_disk && id == 1) { ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Hibernate", ++ &reply, ++ DBUS_TYPE_INVALID); ++ } else if (suspend_ram && id == 2) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Suspend", ++ &reply, ++ DBUS_TYPE_INT32, ++ &wake, ++ DBUS_TYPE_INVALID); ++ else if (standby && id == 3) ++ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, ++ HAL_UDI_COMPUTER, ++ DBUS_HAL_SYSTEM_POWER_INTERFACE, ++ "Standby", ++ &reply, ++ DBUS_TYPE_INVALID); ++ else ++ return; ++ if (error) ++ KMessageBox::error(this, i18n("Suspend failed")); ++ ++ // possibly after resume :) ++ reject(); ++} + + void KSMShutdownDlg::slotLogout() + { +Index: ksmserver/shutdowndlg.h +=================================================================== +--- ksmserver/shutdowndlg.h.orig ++++ ksmserver/shutdowndlg.h +@@ -60,6 +60,8 @@ public slots: + void slotHalt(); + void slotReboot(); + void slotReboot(int); ++ void slotSuspend(); ++ void slotSuspend(int); + + protected: + ~KSMShutdownDlg() {}; +@@ -70,6 +72,7 @@ private: + QString m_bootOption; + QPopupMenu *targets; + QStringList rebootOptions; ++ bool suspend_disk, suspend_ram, standby; + }; + + class KSMDelayedPushButton : public KPushButton diff --git a/opensuse/core/tdebase/ksmserver-timed.diff b/opensuse/core/tdebase/ksmserver-timed.diff new file mode 100644 index 000000000..89f4a7004 --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-timed.diff @@ -0,0 +1,700 @@ +Index: ksmserver/KSMServerInterface.h +=================================================================== +--- ksmserver/KSMServerInterface.h.orig ++++ ksmserver/KSMServerInterface.h +@@ -22,6 +22,8 @@ k_dcop: + + virtual void suspendStartup( QCString ) = 0; + virtual void resumeStartup( QCString ) = 0; ++ ++ virtual void logoutTimed( int, int, QString ) = 0; + }; + + #endif +Index: ksmserver/Makefile.am +=================================================================== +--- ksmserver/Makefile.am.orig ++++ ksmserver/Makefile.am +@@ -28,7 +28,7 @@ ksmserver_la_METASOURCES = AUTO + # Order is important for --enable-final! + ksmserver_la_SOURCES = main.cpp server.cpp shutdowndlg.cpp \ + legacy.cpp startup.cpp shutdown.cpp client.cpp \ +- KSMServerInterface.skel server.skel ++ KSMServerInterface.skel server.skel timed.ui + + ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module + ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) -llazy $(DBUS_LIBS) +@@ -42,7 +42,7 @@ updatedir = $(kde_datadir)/kconf_update + + + EXTRA_PROGRAMS = testsh +-testsh_SOURCES = test.cpp ++testsh_SOURCES = test.cpp timed.ui + testsh_LDFLAGS = $(all_libraries) $(KDE_RPATH) + testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la -llazy $(DBUS_LIBS) + +Index: ksmserver/server.h +=================================================================== +--- ksmserver/server.h.orig ++++ ksmserver/server.h +@@ -85,6 +85,7 @@ public: + // public API + void restoreSession( QString sessionName ); + void startDefaultSession(); ++ + void shutdown( KApplication::ShutdownConfirm confirm, + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode ); +@@ -92,6 +93,11 @@ public: + virtual void suspendStartup( QCString app ); + virtual void resumeStartup( QCString app ); + ++ bool checkStatus( bool &logoutConfirmed, bool &maysd, ++ KApplication::ShutdownConfirm confirm, ++ KApplication::ShutdownType sdtype, ++ KApplication::ShutdownMode sdmode ); ++ + public slots: + void cleanUp(); + +@@ -142,6 +148,11 @@ private: + bool defaultSession() const; // empty session + void setupXIOErrorHandler(); + ++ void shutdownInternal( KApplication::ShutdownConfirm confirm, ++ KApplication::ShutdownType sdtype, ++ KApplication::ShutdownMode sdmode, ++ QString bootOption = QString::null ); ++ + void performLegacySessionSave(); + void storeLegacySession( KConfig* config ); + void restoreLegacySession( KConfig* config ); +@@ -157,6 +168,7 @@ private: + + // public dcop interface + void logout( int, int, int ); ++ virtual void logoutTimed( int, int, QString ); + QStringList sessionList(); + QString currentSession(); + void saveCurrentSession(); +Index: ksmserver/shutdown.cpp +=================================================================== +--- ksmserver/shutdown.cpp.orig ++++ ksmserver/shutdown.cpp +@@ -93,14 +93,16 @@ void KSMServer::logout( int confirm, int + (KApplication::ShutdownMode)sdmode ); + } + +-void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, +- KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode ) ++bool KSMServer::checkStatus( bool &logoutConfirmed, bool &maysd, ++ KApplication::ShutdownConfirm confirm, ++ KApplication::ShutdownType sdtype, ++ KApplication::ShutdownMode sdmode ) + { + pendingShutdown.stop(); + if( dialogActive ) +- return; ++ return false; + if( state >= Shutdown ) // already performing shutdown +- return; ++ return false; + if( state != Idle ) // performing startup + { + // perform shutdown as soon as startup is finished, in order to avoid saving partial session +@@ -111,25 +113,44 @@ void KSMServer::shutdown( KApplication:: + pendingShutdown_sdtype = sdtype; + pendingShutdown_sdmode = sdmode; + } +- return; ++ return false; + } + + KConfig *config = KGlobal::config(); + config->reparseConfiguration(); // config may have changed in the KControl module + + config->setGroup("General" ); +- bool logoutConfirmed = ++ logoutConfirmed = + (confirm == KApplication::ShutdownConfirmYes) ? false : +- (confirm == KApplication::ShutdownConfirmNo) ? true : +- !config->readBoolEntry( "confirmLogout", true ); +- bool maysd = false; ++ (confirm == KApplication::ShutdownConfirmNo) ? true : ++ !config->readBoolEntry( "confirmLogout", true ); ++ maysd = false; + if (config->readBoolEntry( "offerShutdown", true ) && DM().canShutdown()) + maysd = true; + if (!maysd) { + if (sdtype != KApplication::ShutdownTypeNone && + sdtype != KApplication::ShutdownTypeDefault && + logoutConfirmed) +- return; /* unsupported fast shutdown */ ++ return false; /* unsupported fast shutdown */ ++ } ++ ++ return true; ++} ++ ++void KSMServer::shutdownInternal( KApplication::ShutdownConfirm confirm, ++ KApplication::ShutdownType sdtype, ++ KApplication::ShutdownMode sdmode, ++ QString bopt ) ++{ ++ bool maysd = false; ++ bool logoutConfirmed = false; ++ if ( !checkStatus( logoutConfirmed, maysd, confirm, sdtype, sdmode ) ) ++ return; ++ ++ KConfig *config = KGlobal::config(); ++ ++ config->setGroup("General" ); ++ if (!maysd) { + sdtype = KApplication::ShutdownTypeNone; + } else if (sdtype == KApplication::ShutdownTypeDefault) + sdtype = (KApplication::ShutdownType) +@@ -138,7 +159,6 @@ void KSMServer::shutdown( KApplication:: + sdmode = KApplication::ShutdownModeInteractive; + + dialogActive = true; +- QString bopt; + if ( !logoutConfirmed ) { + KSMShutdownFeedback::start(); // make the screen gray + logoutConfirmed = +@@ -204,6 +224,42 @@ void KSMServer::shutdown( KApplication:: + dialogActive = false; + } + ++void KSMServer::shutdown( KApplication::ShutdownConfirm confirm, ++ KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode ) ++{ ++ shutdownInternal( confirm, sdtype, sdmode ); ++} ++ ++#include <kmessagebox.h> ++ ++void KSMServer::logoutTimed( int sdtype, int sdmode, QString bootOption ) ++{ ++ int confirmDelay; ++ ++ KConfig* config = KGlobal::config(); ++ config->setGroup( "General" ); ++ ++ if ( sdtype == KApplication::ShutdownTypeHalt ) ++ confirmDelay = config->readNumEntry( "confirmShutdownDelay", 31 ); ++ else if ( sdtype == KApplication::ShutdownTypeReboot ) ++ confirmDelay = config->readNumEntry( "confirmRebootDelay", 31 ); ++ else ++ confirmDelay = config->readNumEntry( "confirmLogoutDelay", 31 ); ++ ++ bool result = true; ++ if (confirmDelay) { ++ KSMShutdownFeedback::start(); // make the screen gray ++ result = KSMDelayedMessageBox::showTicker( (KApplication::ShutdownType)sdtype, bootOption, confirmDelay ); ++ KSMShutdownFeedback::stop(); // make the screen become normal again ++ } ++ ++ if ( result ) ++ shutdownInternal( KApplication::ShutdownConfirmNo, ++ (KApplication::ShutdownType)sdtype, ++ (KApplication::ShutdownMode)sdmode, ++ bootOption ); ++} ++ + void KSMServer::pendingShutdownTimeout() + { + shutdown( pendingShutdown_confirm, pendingShutdown_sdtype, pendingShutdown_sdmode ); +Index: ksmserver/shutdowndlg.cpp +=================================================================== +--- ksmserver/shutdowndlg.cpp.orig ++++ ksmserver/shutdowndlg.cpp +@@ -25,6 +25,7 @@ Copyright (C) 2000 Matthias Ettrich <ett + #include <qimage.h> + + #include <klocale.h> ++#include <kconfig.h> + #include <kapplication.h> + #include <kdebug.h> + #include <kpushbutton.h> +@@ -488,3 +489,67 @@ void KSMDelayedPushButton::slotTimeout() + popt->stop(); + setDown(false); + } ++ ++KSMDelayedMessageBox::KSMDelayedMessageBox( KApplication::ShutdownType sdtype, const QString &bootOption, int confirmDelay ) ++ : TimedLogoutDlg( 0, 0, true, WType_Popup ), m_remaining(confirmDelay) ++{ ++ if ( sdtype == KApplication::ShutdownTypeHalt ) ++ { ++ m_title->setText( i18n( "Would you like to turn off your computer?" ) ); ++ m_template = i18n( "This computer will turn off automatically\n" ++ "after %1 seconds." ); ++ m_logo->setPixmap( BarIcon( "exit", 48 ) ); ++ } else if ( sdtype == KApplication::ShutdownTypeReboot ) ++ { ++ if (bootOption.isEmpty()) ++ m_title->setText( i18n( "Would you like to reboot your computer?" ) ); ++ else ++ m_title->setText( i18n( "Would you like to reboot to \"%1\"?" ).arg(bootOption) ); ++ m_template = i18n( "This computer will reboot automatically\n" ++ "after %1 seconds." ); ++ m_logo->setPixmap( BarIcon( "reload", 48 ) ); ++ } else { ++ m_title->setText( i18n( "Would you like to end your current session?" ) ); ++ m_template = i18n( "This session will end\n" ++ "after %1 seconds automatically." ); ++ m_logo->setPixmap( BarIcon( "previous", 48 ) ); ++ } ++ ++ updateText(); ++ adjustSize(); ++ if ( double( height() ) / width() < 0.25 ) ++ { ++ setFixedHeight( qRound( width() * 0.3 ) ); ++ adjustSize(); ++ } ++ QTimer *timer = new QTimer( this ); ++ timer->start( 1000 ); ++ connect( timer, SIGNAL( timeout() ), SLOT( updateText() ) ); ++ KDialog::centerOnScreen(this); ++} ++ ++void KSMDelayedMessageBox::updateText() ++{ ++ m_remaining--; ++ if ( m_remaining == 0 ) ++ { ++ accept(); ++ return; ++ } ++ m_text->setText( m_template.arg( m_remaining ) ); ++} ++ ++bool KSMDelayedMessageBox::showTicker( KApplication::ShutdownType sdtype, const QString &bootOption, int confirmDelay ) ++{ ++ kapp->enableStyles(); ++ KSMDelayedMessageBox msg( sdtype, bootOption, confirmDelay ); ++ QSize sh = msg.sizeHint(); ++ QRect rect = KGlobalSettings::desktopGeometry(QCursor::pos()); ++ ++ msg.move(rect.x() + (rect.width() - sh.width())/2, ++ rect.y() + (rect.height() - sh.height())/2); ++ bool result = msg.exec(); ++ ++ kapp->disableStyles(); ++ return result; ++} +Index: ksmserver/shutdowndlg.h +=================================================================== +--- ksmserver/shutdowndlg.h.orig ++++ ksmserver/shutdowndlg.h +@@ -17,6 +17,7 @@ class QVButtonGroup; + class QPopupMenu; + class QTimer; + ++#include "timed.h" + #include <kapplication.h> + + // The (singleton) widget that makes the desktop gray. +@@ -94,4 +95,22 @@ private: + QTimer *popt; + }; + ++class QLabel; ++ ++class KSMDelayedMessageBox : public TimedLogoutDlg ++{ ++ Q_OBJECT ++ ++public: ++ KSMDelayedMessageBox( KApplication::ShutdownType sdtype, const QString &bootOption, int confirmDelay ); ++ static bool showTicker( KApplication::ShutdownType sdtype, const QString &bootOption, int confirmDelay ); ++ ++protected slots: ++ void updateText(); ++ ++private: ++ QString m_template; ++ int m_remaining; ++}; ++ + #endif +Index: ksmserver/test.cpp +=================================================================== +--- ksmserver/test.cpp.orig ++++ ksmserver/test.cpp +@@ -14,11 +14,16 @@ main(int argc, char *argv[]) + a.iconLoader()->addAppDir("ksmserver"); + KSMShutdownFeedback::start(); + ++ // ShutdownTypeNone == Logout == 0 ++ // ShutdownTypeReboot == 1 ++ // ShutdownTypeHalt == 2 + KApplication::ShutdownType sdtype = KApplication::ShutdownTypeNone; + QString bopt; ++ KSMDelayedMessageBox::showTicker( sdtype ); ++ /* + (void)KSMShutdownDlg::confirmShutdown( true, + sdtype, +- bopt ); ++ bopt );*/ + /* (void)KSMShutdownDlg::confirmShutdown( false, + sdtype, + bopt ); */ +Index: ksmserver/timed.ui +=================================================================== +--- /dev/null ++++ ksmserver/timed.ui +@@ -0,0 +1,352 @@ ++<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> ++<class>TimedLogoutDlg</class> ++<widget class="QDialog"> ++ <property name="name"> ++ <cstring>TimedLogoutDlg</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>381</width> ++ <height>131</height> ++ </rect> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>5</hsizetype> ++ <vsizetype>5</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="caption"> ++ <string>Confirmation</string> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <property name="spacing"> ++ <number>0</number> ++ </property> ++ <widget class="QFrame"> ++ <property name="name"> ++ <cstring>frame3</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>5</hsizetype> ++ <vsizetype>5</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="frameShape"> ++ <enum>StyledPanel</enum> ++ </property> ++ <property name="frameShadow"> ++ <enum>Raised</enum> ++ </property> ++ <property name="lineWidth"> ++ <number>2</number> ++ </property> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <property name="midLineWidth"> ++ <number>0</number> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout10</cstring> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <property name="spacing"> ++ <number>0</number> ++ </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout8</cstring> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout6</cstring> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <property name="spacing"> ++ <number>0</number> ++ </property> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer3_2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Vertical</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>MinimumExpanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>20</width> ++ <height>2</height> ++ </size> ++ </property> ++ </spacer> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_logo</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>1</hsizetype> ++ <vsizetype>1</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>48</width> ++ <height>48</height> ++ </size> ++ </property> ++ <property name="scaledContents"> ++ <bool>true</bool> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer3</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Vertical</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>MinimumExpanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>20</width> ++ <height>2</height> ++ </size> ++ </property> ++ </spacer> ++ </vbox> ++ </widget> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout7</cstring> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <property name="margin"> ++ <number>7</number> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_title</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>0</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="font"> ++ <font> ++ <bold>1</bold> ++ </font> ++ </property> ++ <property name="text"> ++ <string>Would you like to shutdown your computer?</string> ++ </property> ++ <property name="textFormat"> ++ <enum>PlainText</enum> ++ </property> ++ <property name="alignment"> ++ <set>AlignVCenter|AlignLeft</set> ++ </property> ++ </widget> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>m_text</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>7</hsizetype> ++ <vsizetype>5</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>If you do not act, your computer will shutdown ++after X automatically.</string> ++ </property> ++ <property name="textFormat"> ++ <enum>RichText</enum> ++ </property> ++ <property name="alignment"> ++ <set>WordBreak|AlignVCenter</set> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer4</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Vertical</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Preferred</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>30</width> ++ <height>0</height> ++ </size> ++ </property> ++ </spacer> ++ </vbox> ++ </widget> ++ </hbox> ++ </widget> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout9</cstring> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>90</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ <widget class="QPushButton"> ++ <property name="name"> ++ <cstring>pushButton1</cstring> ++ </property> ++ <property name="text"> ++ <string>Confirm</string> ++ </property> ++ <property name="on"> ++ <bool>false</bool> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer2_2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>90</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ <widget class="QPushButton"> ++ <property name="name"> ++ <cstring>pushButton2</cstring> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy> ++ <hsizetype>1</hsizetype> ++ <vsizetype>5</vsizetype> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Cancel</string> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer2_2_2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>90</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ </hbox> ++ </widget> ++ </vbox> ++ </widget> ++ </hbox> ++ </widget> ++ </vbox> ++</widget> ++<connections> ++ <connection> ++ <sender>pushButton1</sender> ++ <signal>clicked()</signal> ++ <receiver>TimedLogoutDlg</receiver> ++ <slot>accept()</slot> ++ </connection> ++ <connection> ++ <sender>pushButton2</sender> ++ <signal>clicked()</signal> ++ <receiver>TimedLogoutDlg</receiver> ++ <slot>reject()</slot> ++ </connection> ++</connections> ++<layoutdefaults spacing="6" margin="11"/> ++</UI> diff --git a/opensuse/core/tdebase/ksmserver-tooltips.diff b/opensuse/core/tdebase/ksmserver-tooltips.diff new file mode 100644 index 000000000..c847907af --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-tooltips.diff @@ -0,0 +1,38 @@ +Index: ksmserver/shutdowndlg.cpp +=================================================================== +--- ksmserver/shutdowndlg.cpp.orig ++++ ksmserver/shutdowndlg.cpp +@@ -126,6 +126,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + + // End session + KPushButton* btnLogout = new KPushButton( KGuiItem( i18n("&End Current Session"), "undo"), frame ); ++ QToolTip::add( btnLogout, i18n( "<qt><h3>End Current Session</h3><p>Log out of the current session to login with a different user</p></qt>" ) ); + QFont btnFont = btnLogout->font(); + buttonlay->addWidget( btnLogout ); + connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout())); +@@ -134,6 +135,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + + // Shutdown + KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame ); ++ QToolTip::add( btnHalt, i18n( "<qt><h3>Turn Off Computer</h3><p>Log out of the current session and turn off the computer</p></qt>" ) ); + btnHalt->setFont( btnFont ); + buttonlay->addWidget( btnHalt ); + connect(btnHalt, SIGNAL(clicked()), SLOT(slotHalt())); +@@ -142,6 +144,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + + // Reboot + KSMDelayedPushButton* btnReboot = new KSMDelayedPushButton( KGuiItem( i18n("&Restart Computer"), "reload"), frame ); ++ QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p><p>Hold the mouse button or the space bar for a short while to get a list of options what to boot</p></qt>" ) ); + btnReboot->setFont( btnFont ); + buttonlay->addWidget( btnReboot ); + +@@ -168,7 +171,8 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + + btnReboot->setPopup(targets); + connect( targets, SIGNAL(activated(int)), SLOT(slotReboot(int)) ); +- } ++ } else ++ QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p></qt>" ) ); + } + + buttonlay->addStretch( 1 ); diff --git a/opensuse/core/tdebase/ksplashml.patch b/opensuse/core/tdebase/ksplashml.patch new file mode 100644 index 000000000..5d3ca0cf7 --- /dev/null +++ b/opensuse/core/tdebase/ksplashml.patch @@ -0,0 +1,19 @@ +Index: ksplashml/kcmksplash/installer.cpp +=================================================================== +--- ksplashml/kcmksplash/installer.cpp.orig ++++ ksplashml/kcmksplash/installer.cpp +@@ -474,6 +474,14 @@ void SplashInstaller::slotTest() + KMessageBox::error(this,i18n("Unable to start ksplashsimple.")); + return; + } ++ if( themeName.startsWith( "ksplashx-" )) ++ { ++ KProcess proc; ++ proc << "ksplashx" << themeName.mid( 9 ) << "--test"; ++ if (!proc.start(KProcess::Block)) ++ KMessageBox::error(this,i18n("Unable to start ksplashx.")); ++ return; ++ } + KProcess proc; + proc << "ksplash" << "--test" << "--theme" << themeName; + if (!proc.start(KProcess::Block)) diff --git a/opensuse/core/tdebase/ksysguard-slp-ratelimit.diff b/opensuse/core/tdebase/ksysguard-slp-ratelimit.diff new file mode 100644 index 000000000..7859ed096 --- /dev/null +++ b/opensuse/core/tdebase/ksysguard-slp-ratelimit.diff @@ -0,0 +1,15 @@ +--- ksysguard/gui/ksysguard.cc ++++ ksysguard/gui/ksysguard.cc +@@ -407,7 +407,11 @@ + } + + #if HAVE_SLP +- rescanSLP(); ++ static int rate; ++ if (++rate > 100) { ++ rate = 0; ++ rescanSLP(); ++ } + #endif + } + diff --git a/opensuse/core/tdebase/ksysguardd-openslp.diff b/opensuse/core/tdebase/ksysguardd-openslp.diff new file mode 100644 index 000000000..4cb0e3795 --- /dev/null +++ b/opensuse/core/tdebase/ksysguardd-openslp.diff @@ -0,0 +1,288 @@ +--- ksysguard/configure.in.in ++++ ksysguard/configure.in.in +@@ -45,5 +45,34 @@ + AC_SUBST(LIBHOSTS) + AC_SUBST(LIBSENSORS) + ++# check for SLP ++dnl define the configure option that disables slp ++AC_ARG_ENABLE(slp, [ --disable-slp don't require libslp (ksysguard do not find daemons) ], with_slp=$enableval, with_slp=yes) ++if test "$with_slp" = "yes"; then ++AC_MSG_CHECKING(for SLP support) ++save_slptest_LIBS="$LIBS" ++save_slptest_LDFLAGS="$LDFLAGS" ++save_slptest_CPPFLAGS="$CPPFLAGS" ++LDFLAGS="$all_libraries $LDFLAGS" ++CPPFLAGS="$CPPFLAGS $all_includes" ++LIBS="-lslp" ++AC_TRY_LINK( [ ++ #include <slp.h> ++ ],[ ++ SLPOpen(0, SLP_FALSE, (SLPHandle*) 0); ++ ],[ ++ AC_DEFINE(HAVE_SLP,1,[Define if SLP is available]) ++ LIB_SLP="-lslp" ++ AC_MSG_RESULT(yes) ++ ],[ ++ AC_MSG_RESULT(no) ++ LIB_SLP="" ++]) ++CPPFLAGS=$save_slptest_CPPFLAGS ++LDFLAGS=$save_slptest_LDFLAGS ++LIBS=$save_slptest_LIBS ++fi ++AC_SUBST(LIB_SLP) ++ + dnl Check for dell laptop support + AM_CONDITIONAL(supports_i8k, test -f /proc/i8k) +--- ksysguard/example/ksysguarddrc ++++ ksysguard/example/ksysguarddrc +@@ -1,5 +1,8 @@ + # /etc/ksysguardd.conf + ++# refresh SLP registration ++SLPrefresh=1800 ++ + # LogFiles: the list of all available logfiles + LogFiles=messages:/var/log/messages,kern:/var/log/kern.log,daemon:/var/log/daemon.log + +--- ksysguard/gui/Makefile.am ++++ ksysguard/gui/Makefile.am +@@ -31,7 +31,7 @@ + ksysguard_LDADD = \ + ksgrd/libksgrd.la \ + SensorDisplayLib/libsensordisplays.la \ +- $(LIB_KDEUI) $(LIB_KIO) $(LIB_KDNSSD) ++ $(LIB_KDEUI) $(LIB_KIO) $(LIB_KDNSSD) $(LIB_SLP) + ksysguard_LDFLAGS = $(all_libraries) $(KDE_RPATH) + + kpm_SOURCES = kpm.c +--- ksysguard/gui/ksysguard.cc ++++ ksysguard/gui/ksysguard.cc +@@ -34,6 +34,8 @@ + #include <stdlib.h> + #include <unistd.h> + ++#include <qregexp.h> ++ + #include <kaboutdata.h> + #include <kaction.h> + #include <kapplication.h> +@@ -280,6 +282,46 @@ + mSplitter->setSizes( sizes ); + } + ++#if HAVE_SLP ++ ++SLPBoolean MySLPSrvURLCallback( SLPHandle phslp, ++ const char* srvurl, ++ unsigned short lifetime, ++ SLPError errcode, ++ void* cookie ) ++{ ++ QRegExp r("^service:ksysguardd.kde://(\\w+):(.*)$"); ++ ++ if ( r.search(srvurl) >= 0 ){ ++ QString host( r.cap(1) ); ++ int port = r.cap(2).toInt() ; ++ ++ if ( !host.isEmpty() && port > 0 ) ++ KSGRD::SensorMgr->engage( host, "", "", port ); ++ }; ++ return SLP_TRUE; ++} ++ ++void TopLevel::rescanSLP( bool enableErrorPopup ) ++{ ++ SLPHandle phslp; ++ SLPError result; ++ result = SLPOpen( NULL, SLP_FALSE, &phslp); ++ if (result != SLP_OK) ++ qWarning( "SLPOpen failed" ); // TODO: KMessagebox ++ else { ++ result = SLPFindSrvs( phslp, ++ "service:ksysguardd.kde", ++ "", // TODO: Scope selector ++ "", // all services ++ MySLPSrvURLCallback, ++ this ); ++ if (result != SLP_OK) ++ qWarning( "unable to register SLP service" ); // TODO: KMessageBox ++ } ++} ++#endif ++ + void TopLevel::initStatusBar() + { + KSGRD::SensorMgr->engage( "localhost", "", "ksysguardd" ); +@@ -363,6 +405,10 @@ + KSGRD::SensorMgr->sendRequest( "localhost", "mem/swap/used", + (KSGRD::SensorClient*)this, 4 ); + } ++ ++#if HAVE_SLP ++ rescanSLP(); ++#endif + } + + bool TopLevel::queryClose() +--- ksysguard/gui/ksysguard.h ++++ ksysguard/gui/ksysguard.h +@@ -24,6 +24,8 @@ + #ifndef KSG_KSYSGUARD_H + #define KSG_KSYSGUARD_H + ++#include <config.h> ++ + #include <qevent.h> + + #include <dcopclient.h> +@@ -34,6 +36,10 @@ + + #include <ksgrd/SensorClient.h> + ++#if HAVE_SLP ++#include <slp.h> ++#endif ++ + class KRecentFilesAction; + class KToggleAction; + +@@ -77,6 +83,9 @@ + virtual void customEvent( QCustomEvent* ); + virtual void timerEvent( QTimerEvent* ); + virtual bool queryClose(); ++#if HAVE_SLP ++ virtual void rescanSLP( bool enableErrorPopup = FALSE ); ++#endif + + protected slots: + void connectHost(); +--- ksysguard/ksysguardd/Makefile.am ++++ ksysguard/ksysguardd/Makefile.am +@@ -31,5 +31,5 @@ + bin_PROGRAMS = ksysguardd + + ksysguardd_SOURCES = Command.c conf.c ksysguardd.c PWUIDCache.c +-ksysguardd_LDFLAGS = $(all_libraries) ++ksysguardd_LDFLAGS = $(all_libraries) $(LIB_SLP) + ksysguardd_LDADD = $(top_builddir)/ksysguard/ksysguardd/$(UNAME)/libksysguardd.a ../CContLib/libccont.a -lkdefakes_nonpic $(LIBHOSTS) $(LIB_DNSSD) $(LIB_KINFO) +--- ksysguard/ksysguardd/conf.c ++++ ksysguard/ksysguardd/conf.c +@@ -56,6 +56,7 @@ + char *begin, *token, *tmp; + ConfigLogFile *confLog; + ++ confSLPrefresh = 0; + LogFileList = new_ctnr(); + SensorList = new_ctnr(); + +@@ -93,6 +94,10 @@ + if ( line[ strlen( line ) - 1 ] == '\n' ) + line[ strlen( line ) - 1 ] = '\0'; + ++ if ( !strncmp( line, "SLPrefresh=", 11 ) ) { ++ confSLPrefresh = atoi( line + 11 ); ++ }; ++ + if ( !strncmp( line, "RegisterDomain",14) && (begin = strchr( line, '=' )) ) RegisterDomain=strdup(begin+1); + + if ( !strncmp( line, "LogFiles", 8 ) && (begin = strchr( line, '=' )) ) { +--- ksysguard/ksysguardd/conf.h ++++ ksysguard/ksysguardd/conf.h +@@ -30,6 +30,8 @@ + + extern char* RegisterDomain; + ++short confSLPrefresh; ++ + void parseConfigFile( const char *filename ); + void freeConfigFile(); + +--- ksysguard/ksysguardd/ksysguardd.c ++++ ksysguard/ksysguardd/ksysguardd.c +@@ -43,6 +43,10 @@ + #ifdef HAVE_DNSSD + #include <dns_sd.h> + #endif ++#if HAVE_SLP ++#include <slp.h> ++#endif ++ + #include "modules.h" + + #include "ksysguardd.h" +@@ -348,6 +352,62 @@ + #endif + + ++#if HAVE_SLP ++void mySLPRegReport(SLPHandle hslp, SLPError errcode, void *cookie) ++{ ++ if (errcode) ++ log_error( "SLP (de)registration error" ); ++} ++ ++void register_slp(); ++ ++void refresh_slp() ++{ ++ register_slp(); ++} ++ ++void register_slp() ++{ ++ SLPHandle phslp; ++ SLPError result; ++ int slp_timeout = confSLPrefresh; ++ struct sigaction act, oact; ++ ++ if ( slp_timeout < 120 ) /* do not bomb the slp server with wrong config */ ++ slp_timeout = 120 ; ++ if ( slp_timeout > SLP_LIFETIME_MAXIMUM ) ++ slp_timeout = SLP_LIFETIME_MAXIMUM; ++ ++ result = SLPOpen( NULL, SLP_FALSE, &phslp); ++ if (result != SLP_OK) ++ log_error( "SLPOpen failed" ); ++ else { ++ char hostname[1024]; ++ char SLPServiceUrl[2048]; ++ gethostname( hostname, 1023 ); ++ snprintf( SLPServiceUrl, 1023, "service:ksysguardd.kde://%s:%i", hostname, SocketPort ); ++ ++ result = SLPReg( phslp, ++ SLPServiceUrl, ++ slp_timeout, ++ 0, ++ "", ++ SLP_TRUE, ++ mySLPRegReport, ++ 0 ); ++ ++ if (result != SLP_OK) ++ log_error( "unable to register SLP service" ); ++ SLPClose( phslp ); ++ ++ act.sa_handler = refresh_slp; ++ if (0 != sigaction(SIGALRM, &act, &oact)) ++ log_error("Error establishing signal handler for SLP"); ++ alarm(slp_timeout - 15); ++ } ++} ++#endif ++ + int createServerSocket() + { + int i = 1; +@@ -402,6 +462,10 @@ + ServiceSocket = DNSServiceRefSockFD(Ref); + #endif + ++#if HAVE_SLP ++ if ( BindToAllInterfaces ) ++ register_slp(); ++#endif + return newSocket; + } + diff --git a/opensuse/core/tdebase/ksysguardd.init b/opensuse/core/tdebase/ksysguardd.init new file mode 100644 index 000000000..3be2cba3b --- /dev/null +++ b/opensuse/core/tdebase/ksysguardd.init @@ -0,0 +1,80 @@ +#! /bin/sh +# Copyright (c) 1995-2001 SuSE GmbH Nuernberg, Germany. +# +# Author: adrian@suse.de +# +# /etc/init.d/ksysguardd +# and its symbolic link +# /usr/sbin/rcksysguardd +# +### BEGIN INIT INFO +# Provides: ksysguardd +# Required-Start: $time $named +# Should-Start: $syslog slpd +# Required-Stop: $null +# Default-Start: 3 5 +# Default-Stop: 0 1 2 4 6 +# Description: remote monitor daemon for ksysguard +# Short-Description: remote monitor daemon for ksysguard +### END INIT INFO + +. /etc/rc.status +test -e /etc/rc.config && source /etc/rc.config + +# Determine the base and follow a runlevel link name. +base=${0##*/} +link=${base#*[SK][0-9][0-9]} + +# Force execution if not called by a runlevel directory. +test -x /usr/bin/ksysguardd || exit 0 + +rc_reset +case "$1" in + start) + echo -n "Starting remote monitor daemon for ksysguard " + + /usr/bin/ksysguardd -d -i >/dev/null + rc_status -v + ;; + stop) + if [ -e /var/run/ksysguardd.pid ]; then + echo -n "Shutting down remote monitor daemon for ksysguard " + killproc -p /var/run/ksysguardd.pid -TERM /usr/bin/ksysguardd + rc_status -v + fi + ;; + try-restart|condrestart) + if test "$1" = "condrestart"; then + echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}" + fi + $0 status + if test $? = 0; then + $0 restart + else + rc_reset # Not running is not a failure. + fi + # Remember status and be quiet + rc_status + ;; + restart|force-reload) + ## If first returns OK call the second, if first or + ## second command fails, set echo return value. + $0 stop; sleep 1 && $0 start + rc_status + ;; + reload) + $0 stop && $0 start + rc_status + ;; + status) + echo -n "Checking for remote monitor daemon for ksysguard " + + checkproc -p /var/run/ksysguardd.pid /usr/bin/ksysguardd + rc_status -v + ;; + *) + echo "Usage: $0 {start|stop|status|restart|reload|try-restart|force-reload}" + exit 1 + ;; +esac +rc_exit diff --git a/opensuse/core/tdebase/ksysguardd.reg b/opensuse/core/tdebase/ksysguardd.reg new file mode 100644 index 000000000..889cb252f --- /dev/null +++ b/opensuse/core/tdebase/ksysguardd.reg @@ -0,0 +1,12 @@ +############################################################################# +# +# OpenSLP registration file +# +# register ksysguard daemon +# +############################################################################# + +service:ksysguardd.kde://$HOSTNAME:3112,en,65535 +watch-port-udp=3112 +description=KDE ksysguard daemon + diff --git a/opensuse/core/tdebase/kwinbindings.diff b/opensuse/core/tdebase/kwinbindings.diff new file mode 100644 index 000000000..51069e5b3 --- /dev/null +++ b/opensuse/core/tdebase/kwinbindings.diff @@ -0,0 +1,43 @@ +Index: kwin/kwinbindings.cpp +=================================================================== +--- kwin/kwinbindings.cpp.orig ++++ kwin/kwinbindings.cpp +@@ -119,22 +119,22 @@ + DEF( I18N_NOOP("Switch to Desktop 2"), CTRL+Qt::Key_F2, WIN+Qt::Key_F2, slotSwitchToDesktop(int) ); + DEF( I18N_NOOP("Switch to Desktop 3"), CTRL+Qt::Key_F3, WIN+Qt::Key_F3, slotSwitchToDesktop(int) ); + DEF( I18N_NOOP("Switch to Desktop 4"), CTRL+Qt::Key_F4, WIN+Qt::Key_F4, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 5"), CTRL+Qt::Key_F5, WIN+Qt::Key_F5, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 6"), CTRL+Qt::Key_F6, WIN+Qt::Key_F6, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 7"), CTRL+Qt::Key_F7, WIN+Qt::Key_F7, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 8"), CTRL+Qt::Key_F8, WIN+Qt::Key_F8, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 9"), CTRL+Qt::Key_F9, WIN+Qt::Key_F9, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 10"), CTRL+Qt::Key_F10, WIN+Qt::Key_F10, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 11"), CTRL+Qt::Key_F11, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 12"), CTRL+Qt::Key_F12, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 13"), CTRL+SHIFT+Qt::Key_F1, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 14"), CTRL+SHIFT+Qt::Key_F2, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 15"), CTRL+SHIFT+Qt::Key_F3, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 16"), CTRL+SHIFT+Qt::Key_F4, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 17"), CTRL+SHIFT+Qt::Key_F5, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 18"), CTRL+SHIFT+Qt::Key_F6, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 19"), CTRL+SHIFT+Qt::Key_F7, 0, slotSwitchToDesktop(int) ); +- DEF( I18N_NOOP("Switch to Desktop 20"), CTRL+SHIFT+Qt::Key_F8, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 5"), 0, WIN+Qt::Key_F5, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 6"), 0, WIN+Qt::Key_F6, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 7"), 0, WIN+Qt::Key_F7, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 8"), 0, WIN+Qt::Key_F8, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 9"), 0, WIN+Qt::Key_F9, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 10"), 0, WIN+Qt::Key_F10, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 11"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 12"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 13"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 14"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 15"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 16"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 17"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 18"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 19"), 0, 0, slotSwitchToDesktop(int) ); ++ DEF( I18N_NOOP("Switch to Desktop 20"), 0, 0, slotSwitchToDesktop(int) ); + DEF( I18N_NOOP("Switch to Next Desktop"), 0, 0, slotSwitchDesktopNext() ); + DEF( I18N_NOOP("Switch to Previous Desktop"), 0, 0, slotSwitchDesktopPrevious() ); + DEF( I18N_NOOP("Switch One Desktop to the Right"), 0, 0, slotSwitchDesktopRight() ); diff --git a/opensuse/core/tdebase/kxkb-include-latin-layout.diff b/opensuse/core/tdebase/kxkb-include-latin-layout.diff new file mode 100644 index 000000000..a0b09a3c5 --- /dev/null +++ b/opensuse/core/tdebase/kxkb-include-latin-layout.diff @@ -0,0 +1,14 @@ +Index: kxkb/kcmlayout.cpp +=================================================================== +--- kxkb/kcmlayout.cpp.orig ++++ kxkb/kcmlayout.cpp +@@ -352,6 +352,9 @@ void LayoutConfig::add() + // Create a copy of the sel widget, as one might add the same layout more + // than one time, with different variants. + QListViewItem* toadd = copyLVI(sel, widget->listLayoutsDst); ++ ++ // Turn on "Include Latin layout" for new language by default (bnc:204402) ++ toadd->setText(LAYOUT_COLUMN_INCLUDE, "us"); + + widget->listLayoutsDst->insertItem(toadd); + if( widget->listLayoutsDst->childCount() > 1 ) diff --git a/opensuse/core/tdebase/less_verbal_kdesu.patch b/opensuse/core/tdebase/less_verbal_kdesu.patch new file mode 100644 index 000000000..fd5375836 --- /dev/null +++ b/opensuse/core/tdebase/less_verbal_kdesu.patch @@ -0,0 +1,26 @@ +Index: kdesu/kdesu/sudlg.cpp +=================================================================== +--- kdesu/kdesu/sudlg.cpp.orig ++++ kdesu/kdesu/sudlg.cpp +@@ -29,18 +29,10 @@ KDEsuDialog::KDEsuDialog(QCString user, + setCaption(i18n("Run as %1").arg(user)); + + QString prompt; +- if (superUserCommand == "sudo" && m_User == "root") { +- prompt = i18n("Please enter your password." ); ++ if (m_User == "root") { ++ prompt = i18n("Please enter the Administrator (root) password to continue."); + } else { +- if (m_User == "root") { +- prompt = i18n("The action you requested needs root privileges. " +- "Please enter root's password below or click " +- "Ignore to continue with your current privileges."); +- } else { +- prompt = i18n("The action you requested needs additional privileges. " +- "Please enter the password for \"%1\" below or click " +- "Ignore to continue with your current privileges.").arg(m_User); +- } ++ prompt = i18n("Please enter password for \"%1\" to continue.").arg(m_User); + } + setPrompt(prompt); + diff --git a/opensuse/core/tdebase/libkonq-kdemm.diff b/opensuse/core/tdebase/libkonq-kdemm.diff new file mode 100644 index 000000000..6eb45eab4 --- /dev/null +++ b/opensuse/core/tdebase/libkonq-kdemm.diff @@ -0,0 +1,117 @@ +Index: libkonq/Makefile.am +=================================================================== +--- libkonq/Makefile.am.orig ++++ libkonq/Makefile.am +@@ -53,14 +53,10 @@ include_HEADERS = konq_popupmenu.h knewm + konq_faviconmgr.h konq_xmlguiclient.h konqbookmarkmanager.h konq_filetip.h + + +-if include_ARTS +-ARTS_MODULE = konq_sound.la +-endif +- +-kde_module_LTLIBRARIES = $(ARTS_MODULE) ++kde_module_LTLIBRARIES = konq_sound.la + konq_sound_la_SOURCES = konq_sound.cc + konq_sound_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) +-konq_sound_la_LIBADD = -lsoundserver_idl -lartskde ++konq_sound_la_LIBADD = -lkdemm + + noinst_HEADERS = konq_sound.h + +Index: libkonq/konq_sound.cc +=================================================================== +--- libkonq/konq_sound.cc.orig ++++ libkonq/konq_sound.cc +@@ -16,10 +16,9 @@ + Boston, MA 02110-1301, USA. + */ + +-#include <kartsdispatcher.h> + #include <kdebug.h> +-#include <kplayobjectfactory.h> +-#include <soundserver.h> ++#include <kdemm/simpleplayer.h> ++#include <kdemm/factory.h> + + #include "konq_sound.h" + +@@ -39,71 +38,38 @@ public: + private: + QStringList m_mimeTypes; + +- KArtsDispatcher m_dispatcher; +- Arts::SoundServerV2 m_soundServer; +- KDE::PlayObjectFactory *m_factory; +- KDE::PlayObject *m_player; ++ KDE::Multimedia::SimplePlayer m_player; + }; + + KonqSoundPlayerImpl::KonqSoundPlayerImpl() +- : m_player(0) + { +- m_soundServer = Arts::Reference("global:Arts_SoundServerV2"); +- m_factory = new KDE::PlayObjectFactory(m_soundServer); + } + + KonqSoundPlayerImpl::~KonqSoundPlayerImpl() + { +- delete m_player; +- delete m_factory; + } + + const QStringList &KonqSoundPlayerImpl::mimeTypes() + { +- if (m_mimeTypes.isEmpty()) +- { +- Arts::TraderQuery query; +- vector<Arts::TraderOffer> *offers = query.query(); +- +- for (vector<Arts::TraderOffer>::iterator it = offers->begin(); +- it != offers->end(); ++it) +- { +- vector<string> *prop = (*it).getProperty("MimeType"); +- for (vector<string>::iterator mt = prop->begin(); +- mt != prop->end(); ++mt) +- if ((*mt).length()) // && (*mt).find("video/") == string::npos) +- m_mimeTypes << (*mt).c_str(); +- delete prop; +- } +- delete offers; +- } ++ if( m_mimeTypes.isEmpty() ) ++ m_mimeTypes = KDE::Multimedia::Factory::self()->playableMimeTypes(); ++ + return m_mimeTypes; + } + + void KonqSoundPlayerImpl::play(const QString &fileName) + { +- if (m_soundServer.isNull()) +- return; +- +- delete m_player; +- if ((m_player = m_factory->createPlayObject(fileName, true))) +- { +- if (m_player->isNull()) +- stop(); +- else +- m_player->play(); +- } ++ m_player.play( KURL( fileName ) ); + } + + void KonqSoundPlayerImpl::stop() + { +- delete m_player; +- m_player = 0; ++ m_player.stop(); + } + + bool KonqSoundPlayerImpl::isPlaying() + { +- return m_player ? (m_player->state() == Arts::posPlaying) : false; ++ return m_player.isPlaying(); + } + + class KonqSoundFactory : public KLibFactory diff --git a/opensuse/core/tdebase/locale-dont-show-flag.diff b/opensuse/core/tdebase/locale-dont-show-flag.diff new file mode 100644 index 000000000..2c0a57454 --- /dev/null +++ b/opensuse/core/tdebase/locale-dont-show-flag.diff @@ -0,0 +1,33 @@ +Index: kcontrol/locale/kcmlocale.cpp +=================================================================== +--- kcontrol/locale/kcmlocale.cpp.orig ++++ kcontrol/locale/kcmlocale.cpp +@@ -292,9 +292,13 @@ void KLocaleConfig::loadCountryList() + QString map( locate( "locale", + QString::fromLatin1( "l10n/%1.png" ) + .arg(tag) ) ); ++#if 0 + QIconSet icon; + if ( !map.isNull() ) + icon = KGlobal::iconLoader()->loadIconSet(map, KIcon::Small); ++#else ++ QIconSet icon; ++#endif + m_comboCountry->insertSubmenu( icon, name, tag, sub, -2 ); + } + +@@ -318,10 +322,14 @@ void KLocaleConfig::loadCountryList() + tag = tag.mid(index + 1); + int menu_index = submenu.isEmpty() ? -1 : -2; + ++#if 0 + QString flag( locate( "locale", + QString::fromLatin1( "l10n/%1/flag.png" ) + .arg(tag) ) ); + QIconSet icon( KGlobal::iconLoader()->loadIconSet(flag, KIcon::Small) ); ++#else ++ QIconSet icon; ++#endif + m_comboCountry->insertItem( icon, name, tag, submenu, menu_index ); + } + diff --git a/opensuse/core/tdebase/lock-xvkbd.diff b/opensuse/core/tdebase/lock-xvkbd.diff new file mode 100644 index 000000000..9b5faae8a --- /dev/null +++ b/opensuse/core/tdebase/lock-xvkbd.diff @@ -0,0 +1,380 @@ +Index: kdesktop/lock/lockprocess.cc +=================================================================== +--- kdesktop/lock/lockprocess.cc.orig ++++ kdesktop/lock/lockprocess.cc +@@ -36,6 +36,8 @@ + #include <kstdguiitem.h> + #include <kpixmapeffect.h> + #include <kpixmap.h> ++#include <kwin.h> ++#include <kwinmodule.h> + + #include <qframe.h> + #include <qlabel.h> +@@ -93,6 +95,8 @@ static Window gVRootData = 0; + static Atom gXA_VROOT; + static Atom gXA_SCREENSAVER_VERSION; + ++extern Atom qt_wm_state; ++ + //=========================================================================== + // + // Screen saver handling process. Handles screensaver window, +@@ -108,7 +112,9 @@ LockProcess::LockProcess(bool child, boo + mVisibility(false), + mRestoreXF86Lock(false), + mForbidden(false), +- mAutoLogout(false) ++ mAutoLogout(false), ++ mVkbdProcess(NULL), ++ mKWinModule(NULL) + { + setupSignals(); + +@@ -909,10 +915,14 @@ bool LockProcess::checkPass() + { + if (mAutoLogout) + killTimer(mAutoLogoutTimerId); ++ ++ showVkbd(); + + PasswordDlg passDlg( this, &greetPlugin); + + int ret = execDialog( &passDlg ); ++ ++ hideVkbd(); + + XWindowAttributes rootAttr; + XGetWindowAttributes(qt_xdisplay(), RootWindow(qt_xdisplay(), +@@ -992,9 +1002,13 @@ bool LockProcess::x11Event(XEvent *event + { + switch (event->type) + { +- case KeyPress: + case ButtonPress: + case MotionNotify: ++ case ButtonRelease: ++ if( forwardVkbdEvent( event )) ++ return true; // filter out ++ // fall through ++ case KeyPress: + if (mBusy || !mDialogs.isEmpty()) + break; + mBusy = true; +@@ -1031,11 +1045,30 @@ bool LockProcess::x11Event(XEvent *event + case ConfigureNotify: // from SubstructureNotifyMask on the root window + if(event->xconfigure.event == qt_xrootwin()) + stayOnTop(); ++ for( QValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); ++ it != mVkbdWindows.end(); ++ ++it ) { ++ if( (*it).id == event->xconfigure.window ) { ++ (*it).rect = QRect( event->xconfigure.x, event->xconfigure.y, ++ event->xconfigure.width, event->xconfigure.height ); ++ break; ++ } ++ } + break; + case MapNotify: // from SubstructureNotifyMask on the root window ++ windowAdded( event->xmap.window, false ); + if( event->xmap.event == qt_xrootwin()) + stayOnTop(); + break; ++ case DestroyNotify: ++ for( QValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); ++ it != mVkbdWindows.end(); ++ ++it ) ++ if( (*it).id == event->xdestroywindow.window ) { ++ mVkbdWindows.remove( it ); ++ break; ++ } ++ break; + } + + // We have grab with the grab window being the root window. +@@ -1060,17 +1093,24 @@ bool LockProcess::x11Event(XEvent *event + + void LockProcess::stayOnTop() + { +- if(!mDialogs.isEmpty()) ++ if(!mDialogs.isEmpty() || !mVkbdWindows.isEmpty()) + { + // this restacking is written in a way so that + // if the stacking positions actually don't change, + // all restacking operations will be no-op, + // and no ConfigureNotify will be generated, + // thus avoiding possible infinite loops +- XRaiseWindow( qt_xdisplay(), mDialogs.first()->winId()); // raise topmost ++ if( !mVkbdWindows.isEmpty()) ++ XRaiseWindow( qt_xdisplay(), mVkbdWindows.first().id ); ++ else ++ XRaiseWindow( qt_xdisplay(), mDialogs.first()->winId()); // raise topmost + // and stack others below it +- Window* stack = new Window[ mDialogs.count() + 1 ]; ++ Window* stack = new Window[ mDialogs.count() + mVkbdWindows.count() + 1 ]; + int count = 0; ++ for( QValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); ++ it != mVkbdWindows.end(); ++ ++it ) ++ stack[ count++ ] = (*it).id; + for( QValueList< QWidget* >::ConstIterator it = mDialogs.begin(); + it != mDialogs.end(); + ++it ) +@@ -1169,4 +1209,200 @@ void LockProcess::msgBox( QMessageBox::I + execDialog( &box ); + } + ++static int run_vkbd = -1; ++void LockProcess::showVkbd() ++{ ++ if( run_vkbd == - 1 ) { ++ int status = system( "hal-find-by-property --key system.formfactor.subtype --string tabletpc" ); ++// status = 0; // enable for testing ++ run_vkbd = ( WIFEXITED( status ) && WEXITSTATUS( status ) == 0 ++ && !KStandardDirs::findExe( "xvkbd" ).isEmpty()) ? 1 : 0; ++ } ++ if( run_vkbd ) { ++ mVkbdWindows.clear(); ++ mVkbdLastEventWindow = None; ++ mKWinModule = new KWinModule( NULL, KWinModule::INFO_WINDOWS ); ++ connect( mKWinModule, SIGNAL( windowAdded( WId )), SLOT( windowAdded( WId ))); ++ mVkbdProcess = new KProcess; ++ *mVkbdProcess << "xvkbd" << "-compact" << "-geometry" << "-0-0" << "-xdm"; ++ mVkbdProcess->start(); ++ } ++} ++ ++void LockProcess::hideVkbd() ++{ ++ if( mVkbdProcess != NULL ) { ++ mVkbdProcess->kill(); ++ delete mVkbdProcess; ++ mVkbdProcess = NULL; ++ delete mKWinModule; ++ mKWinModule = NULL; ++ mVkbdWindows.clear(); ++ } ++} ++ ++void LockProcess::windowAdded( WId w ) ++{ ++ windowAdded( w, true ); ++} ++ ++void LockProcess::windowAdded( WId w, bool managed ) ++{ ++ KWin::WindowInfo info = KWin::windowInfo( w, 0, NET::WM2WindowClass ); ++ if( info.windowClassClass().lower() != "xvkbd" ) ++ return; ++ // Unmanaged windows (i.e. popups) don't currently work anyway, since they ++ // don't have WM_CLASS set anyway. I could perhaps try tricks with X id ++ // ranges if really needed. ++ if( managed ) { ++ // withdraw the window, wait for it to be withdrawn, reparent it directly ++ // to root at the right position ++ XWithdrawWindow( qt_xdisplay(), w, qt_xscreen()); ++ for(;;) { ++ Atom type; ++ int format; ++ unsigned long length, after; ++ unsigned char *data; ++ int r = XGetWindowProperty( qt_xdisplay(), w, qt_wm_state, 0, 2, ++ false, AnyPropertyType, &type, &format, ++ &length, &after, &data ); ++ bool withdrawn = true; ++ if ( r == Success && data && format == 32 ) { ++ Q_UINT32 *wstate = (Q_UINT32*)data; ++ withdrawn = (*wstate == WithdrawnState ); ++ XFree( (char *)data ); ++ } ++ if( withdrawn ) ++ break; ++ } ++ } ++ XSelectInput( qt_xdisplay(), w, StructureNotifyMask ); ++ XWindowAttributes attr_geom; ++ if( !XGetWindowAttributes( qt_xdisplay(), w, &attr_geom )) ++ return; ++ int x = XDisplayWidth( qt_xdisplay(), qt_xscreen()) - attr_geom.width; ++ int y = XDisplayHeight( qt_xdisplay(), qt_xscreen()) - attr_geom.height; ++ if( managed ) { ++ XSetWindowAttributes attr; ++ attr.override_redirect = True; ++ XChangeWindowAttributes( qt_xdisplay(), w, CWOverrideRedirect, &attr ); ++ XReparentWindow( qt_xdisplay(), w, qt_xrootwin(), x, y ); ++ XMapWindow( qt_xdisplay(), w ); ++ } ++ VkbdWindow data; ++ data.id = w; ++ data.rect = QRect( x, y, attr_geom.width, attr_geom.height ); ++ mVkbdWindows.prepend( data ); ++} ++ ++bool LockProcess::forwardVkbdEvent( XEvent* event ) ++{ ++ if( mVkbdProcess == NULL ) ++ return false; ++ QPoint pos; ++ Time time; ++ switch( event->type ) ++ { ++ case ButtonPress: ++ case ButtonRelease: ++ pos = QPoint( event->xbutton.x, event->xbutton.y ); ++ time = event->xbutton.time; ++ break; ++ case MotionNotify: ++ pos = QPoint( event->xmotion.x, event->xmotion.y ); ++ time = event->xmotion.time; ++ break; ++ default: ++ return false; ++ } ++ // vkbd windows are kept topmost, so just find the first one in the position ++ for( QValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); ++ it != mVkbdWindows.end(); ++ ++it ) { ++ if( (*it).rect.contains( pos )) { ++ // Find the subwindow where the event should actually go. ++ // Not exactly cheap in the number of X roundtrips but oh well. ++ Window window = (*it).id; ++ Window root, child; ++ int root_x, root_y, x, y; ++ unsigned int mask; ++ for(;;) { ++ if( !XQueryPointer( qt_xdisplay(), window, &root, &child, &root_x, &root_y, &x, &y, &mask )) ++ return false; ++ if( child == None ) ++ break; ++ window = child; ++ } ++ switch( event->type ) ++ { ++ case ButtonPress: ++ case ButtonRelease: ++ event->xbutton.x = x; ++ event->xbutton.y = y; ++ event->xbutton.subwindow = None; ++ break; ++ case MotionNotify: ++ event->xmotion.x = x; ++ event->xmotion.y = y; ++ event->xmotion.subwindow = None; ++ break; ++ } ++ event->xany.window = window; ++ sendVkbdFocusInOut( window, time ); ++ XSendEvent( qt_xdisplay(), window, False, 0, event ); ++ return true; ++ } ++ } ++ sendVkbdFocusInOut( None, time ); ++ return false; ++} ++ ++// Fake EnterNotify/LeaveNotify events as the mouse moves. They're not sent by X ++// because of the grab and having them makes xvkbd highlight the buttons (but ++// not needed otherwise it seems). ++void LockProcess::sendVkbdFocusInOut( WId window, Time t ) ++{ ++ if( mVkbdLastEventWindow == window ) ++ return; ++ if( mVkbdLastEventWindow != None ) { ++ XEvent e; ++ e.xcrossing.type = LeaveNotify; ++ e.xcrossing.display = qt_xdisplay(); ++ e.xcrossing.window = mVkbdLastEventWindow; ++ e.xcrossing.root = qt_xrootwin(); ++ e.xcrossing.subwindow = None; ++ e.xcrossing.time = t; ++ e.xcrossing.x = 0; ++ e.xcrossing.y = 0; ++ e.xcrossing.x_root = -1; ++ e.xcrossing.y_root = -1; ++ e.xcrossing.mode = NotifyNormal; ++ e.xcrossing.detail = NotifyAncestor; ++ e.xcrossing.same_screen = True; ++ e.xcrossing.focus = False; ++ e.xcrossing.state = 0; ++ XSendEvent( qt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); ++ } ++ mVkbdLastEventWindow = window; ++ if( mVkbdLastEventWindow != None ) { ++ XEvent e; ++ e.xcrossing.type = EnterNotify; ++ e.xcrossing.display = qt_xdisplay(); ++ e.xcrossing.window = mVkbdLastEventWindow; ++ e.xcrossing.root = qt_xrootwin(); ++ e.xcrossing.subwindow = None; ++ e.xcrossing.time = t; ++ e.xcrossing.x = 0; ++ e.xcrossing.y = 0; ++ e.xcrossing.x_root = 0; ++ e.xcrossing.y_root = 0; ++ e.xcrossing.mode = NotifyNormal; ++ e.xcrossing.detail = NotifyAncestor; ++ e.xcrossing.same_screen = True; ++ e.xcrossing.focus = False; ++ e.xcrossing.state = 0; ++ XSendEvent( qt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); ++ } ++} ++ + #include "lockprocess.moc" +Index: kdesktop/lock/lockprocess.h +=================================================================== +--- kdesktop/lock/lockprocess.h.orig ++++ kdesktop/lock/lockprocess.h +@@ -23,6 +23,7 @@ + #include <X11/Xlib.h> + + class KLibrary; ++class KWinModule; + + struct GreeterPluginHandle { + KLibrary *library; +@@ -53,7 +54,7 @@ public: + + void msgBox( QMessageBox::Icon type, const QString &txt ); + int execDialog( QDialog* dlg ); +- ++ + public slots: + void quitSaver(); + void preparePopup(); +@@ -70,6 +71,7 @@ private slots: + void suspend(); + void checkDPMSActive(); + void slotDeadTimePassed(); ++ void windowAdded( WId ); + + private: + void configure(); +@@ -93,6 +95,11 @@ private: + void stayOnTop(); + void lockXF86(); + void unlockXF86(); ++ void showVkbd(); ++ void hideVkbd(); ++ bool forwardVkbdEvent( XEvent* event ); ++ void sendVkbdFocusInOut( WId window, Time t ); ++ void windowAdded( WId window, bool managed ); + void resume( bool force ); + static QVariant getConf(void *ctx, const char *key, const QVariant &dflt); + +@@ -125,6 +132,15 @@ private: + int mAutoLogoutTimerId; + int mAutoLogoutTimeout; + bool mAutoLogout; ++ KProcess* mVkbdProcess; ++ KWinModule* mKWinModule; ++ struct VkbdWindow ++ { ++ WId id; ++ QRect rect; ++ }; ++ QValueList< VkbdWindow > mVkbdWindows; ++ WId mVkbdLastEventWindow; + }; + + #endif diff --git a/opensuse/core/tdebase/lowdiskspace.patch b/opensuse/core/tdebase/lowdiskspace.patch new file mode 100644 index 000000000..a2ee05f54 --- /dev/null +++ b/opensuse/core/tdebase/lowdiskspace.patch @@ -0,0 +1,413 @@ +Subject: Dialog notifying about running low on disk space +From: Lubos Lunak +Feature: bnc#199054 +Patch-upstream: no + +Index: kioslave/media/medianotifier/Makefile.am +=================================================================== +--- kioslave/media/medianotifier/Makefile.am.orig ++++ kioslave/media/medianotifier/Makefile.am +@@ -5,7 +5,8 @@ kded_medianotifier_la_LDFLAGS = -module + kded_medianotifier_la_LIBADD = ../libmediacommon/libmediacommon.la $(LIB_KDECORE) \ + $(LIB_KDEUI) $(LIB_KIO) + kded_medianotifier_la_SOURCES = medianotifier.cpp medianotifier.skel \ +- notificationdialog.cpp notificationdialogview.ui ++ notificationdialog.cpp notificationdialogview.ui \ ++ freespacenotifier.cpp freespacewidget.ui + + noinst_HEADERS = medianotifier.h notificationdialog.h + +Index: kioslave/media/medianotifier/medianotifier.h +=================================================================== +--- kioslave/media/medianotifier/medianotifier.h.orig ++++ kioslave/media/medianotifier/medianotifier.h +@@ -27,6 +27,8 @@ + #include <qstring.h> + #include <qmap.h> + ++class FreeSpaceNotifier; ++ + class MediaNotifier: public KDEDModule + { + Q_OBJECT +@@ -52,6 +54,8 @@ private: + const QString &autoopenFile ); + + QMap<KIO::Job*,bool> m_allowNotificationMap; ++ FreeSpaceNotifier* m_freeSpaceNotifier; + }; ++ + #endif + +Index: kioslave/media/medianotifier/medianotifier.cpp +=================================================================== +--- kioslave/media/medianotifier/medianotifier.cpp.orig ++++ kioslave/media/medianotifier/medianotifier.cpp +@@ -36,6 +36,7 @@ + #include "notifiersettings.h" + #include "notifieraction.h" + #include "mediamanagersettings.h" ++#include "freespacenotifier.h" + + MediaNotifier::MediaNotifier(const QCString &name) : KDEDModule(name) + { +@@ -44,6 +45,8 @@ MediaNotifier::MediaNotifier(const QCStr + + connectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString, bool)", + "onMediumChange(QString, bool)", true ); ++ ++ m_freeSpaceNotifier = new FreeSpaceNotifier( this ); + } + + MediaNotifier::~MediaNotifier() +@@ -53,6 +56,7 @@ MediaNotifier::~MediaNotifier() + + disconnectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString, bool)", + "onMediumChange(QString, bool)" ); ++ delete m_freeSpaceNotifier; + } + + void MediaNotifier::onMediumChange( const QString &name, bool allowNotification ) +Index: kioslave/media/medianotifier/freespacenotifier.cpp +=================================================================== +--- /dev/null ++++ kioslave/media/medianotifier/freespacenotifier.cpp +@@ -0,0 +1,159 @@ ++/* This file is part of the KDE Project ++ Copyright (c) 2006 Lukas Tinkl <ltinkl@suse.cz> ++ Copyright (c) 2008 Lubos Lunak <l.lunak@suse.cz> ++ ++ 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, see <http://www.gnu.org/licenses/>. ++*/ ++ ++#include "freespacenotifier.h" ++ ++#include <sys/vfs.h> ++#include <unistd.h> ++ ++#include <qdir.h> ++#include <qfile.h> ++#include <qlabel.h> ++#include <qspinbox.h> ++ ++#include <kconfig.h> ++#include <kdebug.h> ++#include <klocale.h> ++#include <krun.h> ++ ++#include "freespacewidget.h" ++ ++ ++FreeSpaceNotifier::FreeSpaceNotifier( QObject* parent ) ++ : QObject( parent ) ++ , lastAvailTimer( NULL ) ++ , dialog( NULL ) ++ , lastAvail( -1 ) ++{ ++ connect( &timer, SIGNAL( timeout() ), SLOT( checkFreeDiskSpace() ) ); ++ KConfig cfg( "lowspacesuse", true ); // read only ++ KConfigGroup group( &cfg, "General" ); ++ limit = group.readNumEntry( "WarnMinimumFreeSpace", 200 ); // MiB ++ if( limit != 0 ) ++ timer.start( 1000 * 60 /* 1 minute */ ); ++} ++ ++FreeSpaceNotifier::~FreeSpaceNotifier() ++{ ++ delete dialog; ++} ++ ++void FreeSpaceNotifier::checkFreeDiskSpace() ++{ ++ if ( dialog ) ++ return; ++ struct statfs sfs; ++ if ( statfs( QFile::encodeName( QDir::homeDirPath() ), &sfs ) == 0 ) ++ { ++ long avail = ( getuid() ? sfs.f_bavail : sfs.f_bfree ); ++ ++ if (avail < 0 || sfs.f_blocks <= 0) ++ return; // we better do not say anything about it ++ ++ int availpct = int( 100 * avail / sfs.f_blocks ); ++ avail = ((long long)avail) * sfs.f_bsize / ( 1024 * 1024 ); // to MiB ++ bool warn = false; ++ if( avail < limit ) // avail disk space dropped under a limit ++ { ++ if( lastAvail < 0 ) // always warn the first time ++ { ++ lastAvail = avail; ++ warn = true; ++ } ++ else if( avail > lastAvail ) // the user freed some space ++ lastAvail = avail; // so warn if it goes low again ++ else if( avail < lastAvail * 0.5 ) // available dropped to a half of previous one, warn again ++ { ++ warn = true; ++ lastAvail = avail; ++ } ++ // do not change lastAvail otherwise, to handle free space slowly going down ++ } ++ if ( warn ) ++ { ++ dialog = new KDialogBase( ++ i18n( "Low Disk Space" ), ++ KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel, ++ KDialogBase::Yes, KDialogBase::No, ++ 0, "lowdiskspacedialog", false, true, ++ i18n( "Open File Manager" ), i18n( "Do Nothing" ), i18n( "Disable Warning" )); ++ widget = new FreeSpaceWidget( dialog ); ++ dialog->setMainWidget( widget ); ++ ++ QString text = i18n( "You are running low on disk space on your home partition (currently %2%, %1 MiB free)." ) ++ .arg( avail ).arg( availpct ); ++ widget->warningLabel->setText( text ); ++ widget->spinbox->setMinValue( 0 ); ++ widget->spinbox->setMaxValue( 100000 ); ++ widget->spinbox->setValue( limit ); ++ connect( dialog, SIGNAL( yesClicked() ), SLOT( slotYes() ) ); ++ connect( dialog, SIGNAL( noClicked() ), SLOT( slotNo() ) ); ++ connect( dialog, SIGNAL( cancelClicked() ), SLOT( slotCancel() ) ); ++ dialog->show(); ++ } ++ } ++} ++ ++void FreeSpaceNotifier::slotYes() ++{ ++ ( void ) new KRun( KURL::fromPathOrURL( QDir::homeDirPath() ) ); ++ cleanupDialog( widget->spinbox->value()); ++} ++ ++void FreeSpaceNotifier::slotNo() ++{ ++ cleanupDialog( widget->spinbox->value()); ++} ++ ++void FreeSpaceNotifier::slotCancel() ++{ ++ cleanupDialog( 0 ); // set limit to zero ++} ++ ++void FreeSpaceNotifier::cleanupDialog( long newLimit ) ++{ ++ dialog->deleteLater(); ++ dialog = NULL; ++ if( limit != newLimit ) ++ { ++ KConfig cfg( "lowspacesuse" ); ++ KConfigGroup group( &cfg, "General" ); ++ limit = newLimit; ++ group.writeEntry( "WarnMinimumFreeSpace", limit ); ++ if( limit == 0 ) ++ timer.stop(); ++ } ++ if( limit != 0 ) ++ { // warn again if constanly below limit for too long ++ if( lastAvailTimer == NULL ) ++ { ++ lastAvailTimer = new QTimer( this ); ++ connect( lastAvailTimer, SIGNAL( timeout()), SLOT( resetLastAvailable())); ++ } ++ lastAvailTimer->start( 1000 * 60 * 60 /* 1 hour*/ ); ++ } ++} ++ ++void FreeSpaceNotifier::resetLastAvailable() ++{ ++ lastAvail = -1; ++ lastAvailTimer->deleteLater(); ++ lastAvailTimer = NULL; ++} ++ ++#include "freespacenotifier.moc" +Index: kioslave/media/medianotifier/freespacenotifier.h +=================================================================== +--- /dev/null ++++ kioslave/media/medianotifier/freespacenotifier.h +@@ -0,0 +1,51 @@ ++/* This file is part of the KDE Project ++ Copyright (c) 2006 Lukas Tinkl <ltinkl@suse.cz> ++ Copyright (c) 2008 Lubos Lunak <l.lunak@suse.cz> ++ ++ 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, see <http://www.gnu.org/licenses/>. ++*/ ++ ++#ifndef _FREESPACENOTIFIER_H_ ++#define _FREESPACENOTIFIER_H_ ++ ++#include <qtimer.h> ++ ++#include <kdialogbase.h> ++ ++class FreeSpaceWidget; ++ ++class FreeSpaceNotifier ++: public QObject ++{ ++ Q_OBJECT ++ public: ++ FreeSpaceNotifier( QObject* parent = NULL ); ++ virtual ~FreeSpaceNotifier(); ++ private slots: ++ void checkFreeDiskSpace(); ++ void resetLastAvailable(); ++ void slotYes(); ++ void slotNo(); ++ void slotCancel(); ++ private: ++ void cleanupDialog( long newLimit ); ++ QTimer timer; ++ QTimer* lastAvailTimer; ++ KDialogBase* dialog; ++ FreeSpaceWidget* widget; ++ long limit; ++ long lastAvail; // used to supress repeated warnings when available space hasn't changed ++}; ++ ++#endif +Index: kioslave/media/medianotifier/freespacewidget.ui +=================================================================== +--- /dev/null ++++ kioslave/media/medianotifier/freespacewidget.ui +@@ -0,0 +1,118 @@ ++<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> ++<class>FreeSpaceWidget</class> ++<widget class="QWidget"> ++ <property name="name"> ++ <cstring>Form1</cstring> ++ </property> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>489</width> ++ <height>108</height> ++ </rect> ++ </property> ++ <property name="caption"> ++ <string>Form1</string> ++ </property> ++ <vbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>warningLabel</cstring> ++ </property> ++ <property name="text"> ++ <string></string> ++ </property> ++ </widget> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>textLabel2</cstring> ++ </property> ++ <property name="text"> ++ <string>Would you like to run a file manager to free some disk space and fix the problem?</string> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer3</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Vertical</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>20</width> ++ <height>40</height> ++ </size> ++ </property> ++ </spacer> ++ <widget class="QLayoutWidget"> ++ <property name="name"> ++ <cstring>layout3</cstring> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QLabel"> ++ <property name="name"> ++ <cstring>textLabel3</cstring> ++ </property> ++ <property name="text"> ++ <string>Warn again when the free space is below</string> ++ </property> ++ </widget> ++ <widget class="QSpinBox"> ++ <property name="name"> ++ <cstring>spinbox</cstring> ++ </property> ++ <property name="suffix"> ++ <string> MiB</string> ++ </property> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer1</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Horizontal</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>30</width> ++ <height>20</height> ++ </size> ++ </property> ++ </spacer> ++ </hbox> ++ </widget> ++ <spacer> ++ <property name="name"> ++ <cstring>spacer2</cstring> ++ </property> ++ <property name="orientation"> ++ <enum>Vertical</enum> ++ </property> ++ <property name="sizeType"> ++ <enum>Expanding</enum> ++ </property> ++ <property name="sizeHint"> ++ <size> ++ <width>20</width> ++ <height>16</height> ++ </size> ++ </property> ++ </spacer> ++ </vbox> ++</widget> ++<layoutdefaults spacing="6" margin="11"/> ++</UI> diff --git a/opensuse/core/tdebase/mach_blass.diff b/opensuse/core/tdebase/mach_blass.diff new file mode 100644 index 000000000..8ea798d13 --- /dev/null +++ b/opensuse/core/tdebase/mach_blass.diff @@ -0,0 +1,160 @@ +Index: ksmserver/shutdowndlg.cpp +=================================================================== +--- ksmserver/shutdowndlg.cpp.orig ++++ ksmserver/shutdowndlg.cpp +@@ -35,6 +35,7 @@ Copyright (C) 2000 Matthias Ettrich <ett + #include <kuser.h> + #include <kpixmap.h> + #include <kimageeffect.h> ++#include <kpixmapeffect.h> + #include <kdialog.h> + #include <kseparator.h> + +@@ -48,6 +49,9 @@ Copyright (C) 2000 Matthias Ettrich <ett + + #include "shutdowndlg.moc" + ++static const int max_faded = 2300; ++static const int slice = 20; ++ + KSMShutdownFeedback * KSMShutdownFeedback::s_pSelf = 0L; + + KSMShutdownFeedback::KSMShutdownFeedback() +@@ -56,12 +60,22 @@ KSMShutdownFeedback::KSMShutdownFeedback + { + setBackgroundMode( QWidget::NoBackground ); + setGeometry( QApplication::desktop()->geometry() ); +- QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) ); +- m_root.resize( width(), height() ); +-} ++ if( QPixmap::defaultDepth() > 8 ) ++ { ++ grabbed.create( size(), 32 ); ++ QTimer::singleShot( 0, this, SLOT( slotGrab() ) ); ++ } ++ else ++ { ++ QTimer::singleShot( 10, this, SLOT( slotPaintEffectOld() ) ); ++ m_root.resize( width(), height() ); ++ } + + +-void KSMShutdownFeedback::slotPaintEffect() ++} ++ ++// the upstream KDE effect ++void KSMShutdownFeedback::slotPaintEffectOld() + { + if ( m_currentY >= height() ) { + if ( backgroundMode() == QWidget::NoBackground ) { +@@ -80,7 +94,76 @@ void KSMShutdownFeedback::slotPaintEffec + bitBlt( this, 0, m_currentY, &pixmap ); + bitBlt( &m_root, 0, m_currentY, &pixmap ); + m_currentY += 10; +- QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) ); ++ QTimer::singleShot( 1, this, SLOT( slotPaintEffectOld() ) ); ++} ++ ++// the SUSE effect ++void KSMShutdownFeedback::slotGrab() ++{ ++ // we start the passed early ++ if ( m_currentY * 4 >= height() * 3 && passed.isNull()) ++ passed.start(); ++ ++ if ( m_currentY >= height() ) { ++ slotPaintEffectNew(); ++ return; ++ } ++ ++ QImage img; ++ img = QPixmap::grabWindow( qt_xrootwin(), 0, ++ m_currentY, width(), ++ slice ); ++ bitBlt(&grabbed, 0, m_currentY, &img); ++ m_currentY += slice; ++ QTimer::singleShot(0, this, SLOT(slotGrab())); ++} ++ ++void KSMShutdownFeedback::slotPaintEffectNew() ++{ ++ const unsigned int shift_scale = 10; ++ const unsigned int scale = 1 << shift_scale; ++ ++ //kdDebug() << "passed before paint " << passed.elapsed() << endl; ++ unsigned int current_fade = QMIN(scale, passed.elapsed() * scale / max_faded); ++ QImage copy; ++ copy.create( grabbed.size(), grabbed.depth() ); ++ unsigned int pixels = grabbed.width()*grabbed.height(); ++ QRgb *orig = ( QRgb* )grabbed.bits(); ++ QRgb *dest = ( QRgb* )copy.bits(); ++ QColor clr; ++ ++ int r, g, b, tg; ++ ++ for ( unsigned int i = 0; i < pixels; ++i ) ++ { ++ r = qRed( orig[i] ); ++ g = qGreen( orig[i] ); ++ b = qBlue( orig[i] ); ++ ++ // qGray formla ++ tg = (r*11 + g*16 + b*5)/32; ++ // make it a bit darker than gray ++ tg = tg - tg / 5; ++ ++ r = ( ( r << shift_scale ) + current_fade * ( tg - r ) ) >> shift_scale; ++ g = ( ( g << shift_scale ) + current_fade * ( tg - g ) ) >> shift_scale; ++ b = ( ( b << shift_scale ) + current_fade * ( tg - b ) ) >> shift_scale; ++ ++ dest[i] = qRgb(r, g, b); ++ } ++ //kdDebug() << "passed before bitBlt " << passed.elapsed() << endl; ++ bitBlt( this, 0, 0, ©); ++ //kdDebug() << "passed after bitBlt " << passed.elapsed() << endl; ++ ++ if ( current_fade >= scale ) { ++ if ( backgroundMode() == QWidget::NoBackground ) { ++ setBackgroundMode( QWidget::NoBackground ); ++ setBackgroundPixmap( copy ); ++ } ++ return; ++ } ++ ++ QTimer::singleShot( 0, this, SLOT( slotPaintEffectNew() ) ); + } + + ////// +Index: ksmserver/shutdowndlg.h +=================================================================== +--- ksmserver/shutdowndlg.h.orig ++++ ksmserver/shutdowndlg.h +@@ -9,7 +9,9 @@ Copyright (C) 2000 Matthias Ettrich <ett + + #include <qpixmap.h> + #include <qdialog.h> ++#include <qdatetime.h> + #include <kpushbutton.h> ++#include <qimage.h> + class QPushButton; + class QVButtonGroup; + class QPopupMenu; +@@ -31,13 +33,17 @@ protected: + ~KSMShutdownFeedback() {} + + private slots: +- void slotPaintEffect(); ++ void slotPaintEffectOld(); ++ void slotPaintEffectNew(); ++ void slotGrab(); + + private: + static KSMShutdownFeedback * s_pSelf; + KSMShutdownFeedback(); + int m_currentY; + QPixmap m_root; ++ QTime passed; ++ QImage grabbed; + }; + + diff --git a/opensuse/core/tdebase/make-wallpapers-hideable.diff b/opensuse/core/tdebase/make-wallpapers-hideable.diff new file mode 100644 index 000000000..d59494940 --- /dev/null +++ b/opensuse/core/tdebase/make-wallpapers-hideable.diff @@ -0,0 +1,48 @@ +Index: kcontrol/background/bgdialog.cpp +=================================================================== +--- kcontrol/background/bgdialog.cpp.orig ++++ kcontrol/background/bgdialog.cpp +@@ -477,14 +477,23 @@ void BGDialog::loadWallpaperFilesList() + //search for .desktop files before searching for images without .desktop files + QStringList lst = m_pDirs->findAllResources("wallpaper", "*desktop", false, true); + QStringList files; ++ QStringList hiddenfiles; + for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) + { + KSimpleConfig fileConfig(*it); + fileConfig.setGroup("Wallpaper"); + ++ int slash = (*it).findRev('/') + 1; ++ QString directory = (*it).left(slash); ++ + QString imageCaption = fileConfig.readEntry("Name"); + QString fileName = fileConfig.readEntry("File"); + ++ if (fileConfig.readBoolEntry("Hidden",false)) { ++ hiddenfiles.append(directory + fileName); ++ continue; ++ } ++ + if (imageCaption.isEmpty()) + { + imageCaption = fileName; +@@ -500,9 +509,8 @@ void BGDialog::loadWallpaperFilesList() + rs = imageCaption + " (" + QString::number(n) + ')'; + lrs = rs.lower(); + } +- int slash = (*it).findRev('/') + 1; +- QString directory = (*it).left(slash); + bool canLoadScaleable = false; ++ + #ifdef HAVE_LIBART + canLoadScaleable = true; + #endif +@@ -516,7 +524,7 @@ void BGDialog::loadWallpaperFilesList() + lst = m_pDirs->findAllResources("wallpaper", "*", false, true); + for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) + { +- if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() ) { ++ if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() && hiddenfiles.grep(*it).empty() ) { + // First try to see if we have a comment describing the image. If we do + // just use the first line of said comment. + KFileMetaInfo metaInfo(*it); diff --git a/opensuse/core/tdebase/media-cryptosupport.diff b/opensuse/core/tdebase/media-cryptosupport.diff new file mode 100644 index 000000000..e9b4fb58d --- /dev/null +++ b/opensuse/core/tdebase/media-cryptosupport.diff @@ -0,0 +1,31 @@ +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -214,10 +214,26 @@ void HALBackend::AddDevice(const char *u + { + /* We only list volume that have a filesystem or volume that have an audio track*/ + if ( libhal_device_get_property_QString(m_halContext, udi, "volume.fsusage") != "filesystem" && ++ libhal_device_get_property_QString(m_halContext, udi, "volume.fsusage") != "crypto" && + !libhal_device_get_property_bool(m_halContext, udi, "volume.disc.has_audio", NULL) && + !libhal_device_get_property_bool(m_halContext, udi, "volume.disc.is_blank", NULL) ) + return; + ++ /* For crypto_LUKS devices check its dm-device, if it is already mounted*/ ++ if ( libhal_device_get_property_QString(m_halContext, udi, "volume.fstype") == "crypto_LUKS" && ++ !libhal_device_get_property_bool(m_halContext, udi, "volume.ignore", NULL) ) { ++ int num; ++ char **dm_uuid = libhal_manager_find_device_string_match(m_halContext, "volume.crypto_luks.clear.backing_volume",udi,&num,NULL); ++ /* if a dm device is found the volume is already decrypted */ ++ if (num == 0) { ++ // TODO: Check for kryptomedia binary. ++ KProcess proc; ++ proc << "kryptomedia" << udi; ++ proc.start(KProcess::DontCare); ++ return; ++ } ++ } ++ + /* Query drive udi */ + QString driveUdi = libhal_device_get_property_QString(m_halContext, udi, "block.storage_device"); + if ( driveUdi.isNull() ) // no storage - no fun diff --git a/opensuse/core/tdebase/media-iPod.diff b/opensuse/core/tdebase/media-iPod.diff new file mode 100644 index 000000000..c5f1f8a24 --- /dev/null +++ b/opensuse/core/tdebase/media-iPod.diff @@ -0,0 +1,26 @@ +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -33,6 +33,7 @@ + #include <kmountpoint.h> + #include <kmessagebox.h> + #include <kio/job.h> ++#include <kprotocolinfo.h> + + #define MOUNT_SUFFIX (libhal_volume_is_mounted(halVolume) ? QString("_mounted") : QString("_unmounted")) + #define MOUNT_ICON_SUFFIX (libhal_volume_is_mounted(halVolume) ? QString("_mount") : QString("_unmount")) +@@ -532,6 +533,13 @@ void HALBackend::setVolumeProperties(Med + case LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER: + { + medium->setIconName("ipod" + MOUNT_ICON_SUFFIX); ++ ++ if (libhal_device_get_property_QString(m_halContext, driveUdi.latin1(), "info.product") == "iPod" && ++ KProtocolInfo::isKnownProtocol( QString("ipod") ) ) ++ { ++ medium->unmountableState( "ipod:/" ); ++ medium->mountableState( libhal_volume_is_mounted(halVolume) ); ++ } + break; + } + case LIBHAL_DRIVE_TYPE_CAMERA: diff --git a/opensuse/core/tdebase/media-teardown_crypto.diff b/opensuse/core/tdebase/media-teardown_crypto.diff new file mode 100644 index 000000000..f713cffc7 --- /dev/null +++ b/opensuse/core/tdebase/media-teardown_crypto.diff @@ -0,0 +1,175 @@ +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig 2011-05-31 13:41:55.000000000 +0200 ++++ kioslave/media/mediamanager/halbackend.cpp 2011-05-31 13:42:48.317334543 +0200 +@@ -1379,4 +1379,54 @@ QString HALBackend::unmount(const QStrin + return QString(); + } + ++bool HALBackend::teardown(const QString &_udi) ++{ ++ const char* dm_udi = _udi.latin1(); ++ const QString blockudi = libhal_device_get_property_QString(m_halContext, dm_udi, "volume.crypto_luks.clear.backing_volume"); ++ if (!blockudi.isEmpty()) { ++ const char* udi = blockudi.latin1(); ++ DBusMessage *dmesg, *reply; ++ DBusError error; ++ const char *options[2]; ++ ++ kdDebug() << "tearDown " << udi << "..." << endl; ++ ++ dbus_error_init(&error); ++ DBusConnection *dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); ++ if (dbus_error_is_set(&error)) ++ { ++ dbus_error_free(&error); ++ return false; ++ } ++ ++ if (!(dmesg = dbus_message_new_method_call ("org.freedesktop.Hal", udi, ++ "org.freedesktop.Hal.Device.Volume.Crypto", ++ "Teardown"))) { ++ kdDebug() << "teardown failed for " << udi << ": could not create dbus message\n"; ++ return false; ++ } ++ ++ dbus_error_init (&error); ++ if (!(reply = dbus_connection_send_with_reply_and_block (dbus_connection, dmesg, -1, &error))) ++ { ++ QString qerror; ++ ++ kdDebug() << "teardown failed for " << udi << ": " << error.name << " " << error.message << endl; ++ qerror = QString("teardown failed for %1 because: %2").arg(udi).arg(error.name); ++ dbus_message_unref (dmesg); ++ dbus_error_free (&error); ++ return false; ++ } ++ ++ kdDebug() << "teardown queued for " << udi << endl; ++ ++ dbus_message_unref (dmesg); ++ dbus_message_unref (reply); ++ return true; ++ } ++ ++ return false; ++} ++ ++ + #include "halbackend.moc" +Index: kioslave/media/mediamanager/halbackend.h +=================================================================== +--- kioslave/media/mediamanager/halbackend.h.orig 2011-05-31 13:39:05.000000000 +0200 ++++ kioslave/media/mediamanager/halbackend.h 2011-05-31 13:42:48.317334543 +0200 +@@ -85,6 +85,7 @@ public: + QString mount(const QString &id); + QString mount(const Medium *medium); + QString unmount(const QString &id); ++ bool teardown(const QString &_udi); + + static bool isHotplug( const QString & id ); + +Index: kioslave/media/mediamanager/mediamanager.cpp +=================================================================== +--- kioslave/media/mediamanager/mediamanager.cpp.orig 2011-05-31 13:39:05.000000000 +0200 ++++ kioslave/media/mediamanager/mediamanager.cpp 2011-05-31 13:43:07.916484054 +0200 +@@ -232,6 +232,17 @@ QString MediaManager::unmount(const QStr + #endif + } + ++bool MediaManager::teardown(const QString &name) ++{ ++#ifdef COMPILE_HALBACKEND ++ if (!m_halbackend) ++ return false; ++ return m_halbackend->teardown(name); ++#else ++ return false; ++#endif ++} ++ + QString MediaManager::nameForLabel(const QString &label) + { + const QPtrList<Medium> media = m_mediaList.list(); +Index: kioslave/media/mediamanager/mediamanager.h +=================================================================== +--- kioslave/media/mediamanager/mediamanager.h.orig 2011-05-31 13:39:05.000000000 +0200 ++++ kioslave/media/mediamanager/mediamanager.h 2011-05-31 13:42:48.318334448 +0200 +@@ -47,6 +47,7 @@ k_dcop: + + QString mount(const QString &uid); + QString unmount(const QString &uid); ++ bool teardown(const QString &uid); + + QString nameForLabel(const QString &label); + ASYNC setUserLabel(const QString &name, const QString &label); +Index: kioslave/media/mounthelper/kio_media_mounthelper.h +=================================================================== +--- kioslave/media/mounthelper/kio_media_mounthelper.h.orig 2007-01-15 12:31:31.000000000 +0100 ++++ kioslave/media/mounthelper/kio_media_mounthelper.h 2011-05-31 13:42:48.318334448 +0200 +@@ -40,6 +40,8 @@ private: + QString m_errorStr; + QString m_device; + bool m_isCdrom; ++ bool isCryptMedia(QString); ++ bool teardown(QString); + + private slots: + void ejectFinished(KProcess* proc); +Index: kioslave/media/mounthelper/kio_media_mounthelper.cpp +=================================================================== +--- kioslave/media/mounthelper/kio_media_mounthelper.cpp.orig 2007-05-14 09:55:40.000000000 +0200 ++++ kioslave/media/mounthelper/kio_media_mounthelper.cpp 2011-05-31 13:42:48.319334353 +0200 +@@ -27,6 +27,7 @@ + #include <dcopclient.h> + #include <dcopref.h> + #include <qtimer.h> ++#include <qregexp.h> + #include <stdlib.h> + #include <kdebug.h> + #include <kglobal.h> +@@ -117,14 +118,17 @@ MountHelper::MountHelper() : KApplicatio + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call( "unmount", medium.id()); + if (reply.isValid()) +- reply.get(m_errorStr); +- if (m_errorStr.isNull()) +- invokeEject(device, true); +- else +- error(); ++ reply.get(m_errorStr); ++ if (m_errorStr.isNull()) { ++ if (!teardown(medium.id())) ++ invokeEject(device, true); ++ } else ++ error(); + m_device = device; +- } else +- invokeEject(device, true); ++ } else { ++ if (!teardown(medium.id())) ++ invokeEject(device, true); ++ } + } + else + { +@@ -139,6 +143,19 @@ MountHelper::MountHelper() : KApplicatio + } + } + ++bool MountHelper::teardown(QString id) ++{ ++ DCOPRef mediamanager("kded", "mediamanager"); ++ DCOPReply reply = mediamanager.call( "teardown", id); ++ if (reply.isValid()) { ++ bool rep; ++ reply.get(rep); ++ kdDebug() << "reply from teardown: " << rep << endl; ++ return rep; ++ } ++ return false; ++} ++ + void MountHelper::invokeEject(const QString &device, bool quiet) + { + KProcess *proc = new KProcess(this); diff --git a/opensuse/core/tdebase/media_suse.diff b/opensuse/core/tdebase/media_suse.diff new file mode 100644 index 000000000..8583f03d2 --- /dev/null +++ b/opensuse/core/tdebase/media_suse.diff @@ -0,0 +1,49 @@ +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -248,14 +248,15 @@ void HALBackend::AddDevice(const char *u + return; + } + } ++ m_mediaList.addMedium(medium, allowNotification); ++ + QMap<QString,QString> options = MediaManagerUtils::splitOptions(mountoptions(udi)); + kdDebug() << "automount " << options["automount"] << endl; +- if (options["automount"] == "true" && allowNotification ) { ++ if (options["automount"] == "true" ) { + QString error = mount(medium); + if (!error.isEmpty()) + kdDebug() << "error " << error << endl; + } +- m_mediaList.addMedium(medium, allowNotification); + + return; + } +@@ -292,6 +293,12 @@ void HALBackend::AddDevice(const char *u + m_mediaList.addMedium(medium, allowNotification); + return; + } ++ ++ if ( allowNotification ) { ++ KProcess proc; ++ proc << "suseplugger" << udi; ++ proc.start(KProcess::DontCare); ++ } + } + + void HALBackend::RemoveDevice(const char *udi) +@@ -816,8 +823,12 @@ QStringList HALBackend::mountoptions(con + removable = libhal_device_get_property_bool(m_halContext, drive_udi.latin1(), "storage.removable", NULL) + || libhal_device_get_property_bool(m_halContext, drive_udi.latin1(), "storage.hotpluggable", NULL); + ++ bool value = removable; ++ QString drive_type = libhal_device_get_property_QString( m_halContext, drive_udi.latin1(), "storage.drive_type" ); ++ value |= ( drive_type == "cdrom" ); ++ + config.setGroup(drive_udi); +- bool value = config.readBoolEntry("automount", false); ++ value = config.readBoolEntry("automount", value); + config.setGroup(name); + + if (libhal_device_get_property_bool(m_halContext, name.latin1(), "volume.disc.is_blank", NULL) diff --git a/opensuse/core/tdebase/mediamanager-mount-point-utf8.diff b/opensuse/core/tdebase/mediamanager-mount-point-utf8.diff new file mode 100644 index 000000000..87db2b9ef --- /dev/null +++ b/opensuse/core/tdebase/mediamanager-mount-point-utf8.diff @@ -0,0 +1,13 @@ +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -471,7 +471,7 @@ void HALBackend::setVolumeProperties(Med + + medium->mountableState( + libhal_volume_get_device_file(halVolume), /* Device node */ +- libhal_volume_get_mount_point(halVolume), /* Mount point */ ++ QString::fromUtf8(libhal_volume_get_mount_point(halVolume)), /* Mount point */ + libhal_volume_get_fstype(halVolume), /* Filesystem type */ + libhal_volume_is_mounted(halVolume) ); /* Mounted ? */ + diff --git a/opensuse/core/tdebase/minicli-combo-editor.diff b/opensuse/core/tdebase/minicli-combo-editor.diff new file mode 100644 index 000000000..698668ec1 --- /dev/null +++ b/opensuse/core/tdebase/minicli-combo-editor.diff @@ -0,0 +1,34 @@ +Index: kdesktop/minicli.h +=================================================================== +--- kdesktop/minicli.h.orig ++++ kdesktop/minicli.h +@@ -52,12 +52,14 @@ public: + + void setCommand(const QString& command); + void reset(); +- void saveConfig(); + void clearHistory(); + + virtual void show(); + virtual QSize sizeHint() const; + ++public slots: ++ void saveConfig(); ++ + protected slots: + virtual void accept(); + virtual void reject(); +Index: kdesktop/minicli.cpp +=================================================================== +--- kdesktop/minicli.cpp.orig ++++ kdesktop/minicli.cpp +@@ -133,6 +133,9 @@ Minicli::Minicli( QWidget *parent, const + connect( m_dlg->cbCommand, SIGNAL( returnPressed() ), + m_dlg->pbRun, SLOT( animateClick() ) ); + ++ m_dlg->cbCommand->setHistoryEditorEnabled( true ); ++ connect( m_dlg->cbCommand, SIGNAL(removed( const QString&) ), SLOT(saveConfig()) ); ++ + // Advanced group box... + connect(m_dlg->cbPriority, SIGNAL(toggled(bool)), SLOT(slotChangeScheduler(bool))); + connect(m_dlg->slPriority, SIGNAL(valueChanged(int)), SLOT(slotPriority(int))); diff --git a/opensuse/core/tdebase/mp3-info.tar.bz2 b/opensuse/core/tdebase/mp3-info.tar.bz2 Binary files differnew file mode 100644 index 000000000..f6cf95bcd --- /dev/null +++ b/opensuse/core/tdebase/mp3-info.tar.bz2 diff --git a/opensuse/core/tdebase/mtab-reenable.patch b/opensuse/core/tdebase/mtab-reenable.patch new file mode 100644 index 000000000..1593a560d --- /dev/null +++ b/opensuse/core/tdebase/mtab-reenable.patch @@ -0,0 +1,153 @@ +diff -wruN kdebase-3.5.10.orig/kioslave/media/mediamanager/fstabbackend.cpp kdebase-3.5.10/kioslave/media/mediamanager/fstabbackend.cpp +--- kdebase-3.5.10.orig/kioslave/media/mediamanager/fstabbackend.cpp 2006-10-01 21:31:54.000000000 +0400 ++++ kdebase-3.5.10/kioslave/media/mediamanager/fstabbackend.cpp 2011-08-17 14:51:34.697199962 +0400 +@@ -50,7 +50,7 @@ + #define MTAB "/etc/mnttab" + #else + #define FSTAB "/etc/fstab" +-#define MTAB "/etc/mtab" ++#define MTAB "/proc/self/mounts" + #endif + + +@@ -58,7 +58,7 @@ + FstabBackend::FstabBackend(MediaList &list, bool networkSharesOnly) + : QObject(), BackendBase(list), m_networkSharesOnly(networkSharesOnly) + { +- KDirWatch::self()->addFile(MTAB); ++ KDirWatch::self()->addDir("/media",0); + KDirWatch::self()->addFile(FSTAB); + + connect( KDirWatch::self(), SIGNAL( dirty(const QString&) ), +@@ -94,7 +94,7 @@ + m_mediaList.removeMedium(*it, false); + } + KDirWatch::self()->removeFile(FSTAB); +- KDirWatch::self()->removeFile(MTAB); ++ KDirWatch::self()->removeDir("/media"); + } + + QString FstabBackend::mount( const QString &_udi ) +@@ -119,8 +119,9 @@ + + void FstabBackend::slotDirty(const QString &path) + { +- if (path==MTAB) ++ if (path=="/media") + { ++ sleep(1); + handleMtabChange(); + } + else if (path==FSTAB) +@@ -136,18 +137,23 @@ + || mount->mountType() == "sysfs" + || mount->mountType() == "fdescfs" + || mount->mountType() == "kernfs" ++ || mount->mountType() == "devtmpfs" ++ || mount->mountType() == "rootfs" + || mount->mountType() == "usbfs" + || mount->mountType().contains( "proc" ) ++ || mount->mountType().contains( "gvfs" ) + || mount->mountType() == "unknown" + || mount->mountType() == "none" + || mount->mountType() == "sunrpc" + || mount->mountedFrom() == "none" + || mount->mountedFrom() == "tmpfs" + || mount->mountedFrom().find("shm") != -1 +- || mount->mountPoint() == "/dev/swap" ++ || !(mount->mountPoint() == "/" || mount->mountPoint().find("/media") == 0 ) ++/* || mount->mountPoint() == "/dev/swap" ++ || mount->mountPoint() == "/dev" + || mount->mountPoint() == "/dev/pts" + || mount->mountPoint().find("/proc") == 0 +- || mount->mountPoint().find("/sys") == 0 ++ || mount->mountPoint().find("/sys") == 0 */ + + // We might want to display only network shares + // since HAL doesn't handle them +@@ -187,10 +193,12 @@ + nothing has changed, do not stat the mount point. Avoids + hang if network shares are stalling */ + QString mtabEntry = dev + "*" + mp + "*" + fs; ++#if 0 + if(m_mtabEntries.contains(mtabEntry)) { + new_mtabIds += m_mtabEntries[mtabEntry]; + continue; + } ++#endif + + QString id = generateId(dev, mp); + new_mtabIds+=id; +@@ -203,7 +211,6 @@ + m_mediaList.changeMediumState(id, true, false, + mime, icon, label); + } +-#if 0 + else if ( !m_mtabIds.contains(id) ) + { + QString name = generateName(dev, fs); +@@ -219,9 +226,8 @@ + m->setIconName(icon); + m->setLabel(label); + +- m_mediaList.addMedium(m, notificationAllowed); ++ m_mediaList.addMedium(m, allowNotification); + } +-#endif + } + + QStringList::iterator it2 = m_mtabIds.begin(); +@@ -247,12 +253,10 @@ + m_mediaList.changeMediumState(*it2, false, false, + mime, icon, label); + } +-#if 0 + else if ( !new_mtabIds.contains(*it2) ) + { + m_mediaList.removeMedium(*it2, allowNotification); + } +-#endif + } + + m_mtabIds = new_mtabIds; +diff -wruN kdebase-3.5.10.orig/kioslave/media/mediamanager/removablebackend.cpp kdebase-3.5.10/kioslave/media/mediamanager/removablebackend.cpp +--- kdebase-3.5.10.orig/kioslave/media/mediamanager/removablebackend.cpp 2006-03-17 13:17:33.000000000 +0300 ++++ kdebase-3.5.10/kioslave/media/mediamanager/removablebackend.cpp 2011-08-17 14:51:51.854357476 +0400 +@@ -27,7 +27,7 @@ + #ifdef _OS_SOLARIS_ + #define MTAB "/etc/mnttab" + #else +-#define MTAB "/etc/mtab" ++#define MTAB "/proc/self/mounts" + #endif + + +@@ -35,7 +35,7 @@ + RemovableBackend::RemovableBackend(MediaList &list) + : QObject(), BackendBase(list) + { +- KDirWatch::self()->addFile(MTAB); ++ KDirWatch::self()->addDir("/media",0); + + connect( KDirWatch::self(), SIGNAL( dirty(const QString&) ), + this, SLOT( slotDirty(const QString&) ) ); +@@ -52,7 +52,7 @@ + m_mediaList.removeMedium(*it, false); + } + +- KDirWatch::self()->removeFile(MTAB); ++ KDirWatch::self()->removeDir("/media"); + } + + bool RemovableBackend::plug(const QString &devNode, const QString &label) +@@ -116,8 +116,9 @@ + + void RemovableBackend::slotDirty(const QString &path) + { +- if (path==MTAB) ++ if (path=="/media") + { ++ sleep(1); + handleMtabChange(); + } + } diff --git a/opensuse/core/tdebase/non-fast-malloc.diff b/opensuse/core/tdebase/non-fast-malloc.diff new file mode 100644 index 000000000..c3f36be87 --- /dev/null +++ b/opensuse/core/tdebase/non-fast-malloc.diff @@ -0,0 +1,15 @@ +--- konqueror/konq_mainwindow.cc ++++ konqueror/konq_mainwindow.cc 2003/05/30 13:19:04 +@@ -4550,9 +4550,9 @@ + int usage_sum = 0; + #if defined(KDE_MALLINFO_STDLIB) || defined(KDE_MALLINFO_MALLOC) + // ugly hack for kdecore/malloc +- extern int kde_malloc_is_used; +- free( calloc( 4, 4 )); // trigger setting kde_malloc_is_used +- if( kde_malloc_is_used ) ++// extern int kde_malloc_is_used; ++// free( calloc( 4, 4 )); // trigger setting kde_malloc_is_used ++ if( 0 ) + { + struct mallinfo m = mallinfo(); + usage_sum = m.hblkhd + m.uordblks; diff --git a/opensuse/core/tdebase/nsplugin-Preference.diff b/opensuse/core/tdebase/nsplugin-Preference.diff new file mode 100644 index 000000000..3e3bcca05 --- /dev/null +++ b/opensuse/core/tdebase/nsplugin-Preference.diff @@ -0,0 +1,13 @@ +Index: nsplugins/pluginscan.cpp +=================================================================== +--- nsplugins/pluginscan.cpp.orig ++++ nsplugins/pluginscan.cpp +@@ -463,7 +463,7 @@ void writeServicesFile( QStringList mime + ts << "Icon=netscape" << endl; + ts << "Comment=" << i18n("Netscape plugin viewer") << endl; + ts << "X-KDE-Library=libnsplugin" << endl; +- ts << "InitialPreference=0" << endl; ++ ts << "InitialPreference=7" << endl; + ts << "ServiceTypes=KParts/ReadOnlyPart,Browser/View" << endl; + ts << "X-KDE-BrowserView-PluginsInfo=nsplugins/pluginsinfo" << endl; + diff --git a/opensuse/core/tdebase/nsplugin-init-gtk.diff b/opensuse/core/tdebase/nsplugin-init-gtk.diff new file mode 100644 index 000000000..882c12443 --- /dev/null +++ b/opensuse/core/tdebase/nsplugin-init-gtk.diff @@ -0,0 +1,49 @@ +--- nsplugins/viewer/nsplugin.h~ 2008-02-13 10:40:38.000000000 +0100 ++++ nsplugins/viewer/nsplugin.h 2010-09-22 23:31:58.721961990 +0200 +@@ -315,6 +315,10 @@ private: + QPtrList<NSPluginInstance> _trash; + + QCString _app; ++ ++ // If plugins use gtk, we call the gtk_init function for them --- ++ // but only do it once. ++ static bool s_initedGTK; + }; + + +--- nsplugins/viewer/nsplugin.cpp~ 2008-02-13 10:40:38.000000000 +0100 ++++ nsplugins/viewer/nsplugin.cpp 2010-09-22 23:31:58.775909705 +0200 +@@ -1330,6 +1330,9 @@ DCOPRef NSPluginViewer::newClass( QStrin + + /****************************************************************************/ + ++bool NSPluginClass::s_initedGTK = false; ++ ++typedef void gtkInitFunc(int *argc, char ***argv); + + NSPluginClass::NSPluginClass( const QString &library, + QObject *parent, const char *name ) +@@ -1377,6 +1380,23 @@ NSPluginClass::NSPluginClass( const QStr + + // initialize plugin + kdDebug(1431) << "Plugin library " << library << " loaded!" << endl; ++ ++ // see if it uses gtk ++ if (!s_initedGTK) { ++ gtkInitFunc* gtkInit = (gtkInitFunc*)_handle->symbol("gtk_init"); ++ if (gtkInit) { ++ kdDebug(1431) << "Calling gtk_init for the plugin" << endl; ++ // Prevent gtk_init() from replacing the X error handlers, since the Gtk ++ // handlers abort when they receive an X error, thus killing the viewer. ++ int (*old_error_handler)(Display*,XErrorEvent*) = XSetErrorHandler(0); ++ int (*old_io_error_handler)(Display*) = XSetIOErrorHandler(0); ++ gtkInit(0, 0); ++ XSetErrorHandler(old_error_handler); ++ XSetIOErrorHandler(old_io_error_handler); ++ s_initedGTK = true; ++ } ++ } ++ + _constructed = true; + _error = initialize()!=NPERR_NO_ERROR; + } diff --git a/opensuse/core/tdebase/openssl1.patch b/opensuse/core/tdebase/openssl1.patch new file mode 100644 index 000000000..f1d250c44 --- /dev/null +++ b/opensuse/core/tdebase/openssl1.patch @@ -0,0 +1,40 @@ +--- kcontrol/crypto/crypto.cpp.orig 2006-10-02 06:31:49.000000000 +1300 ++++ kcontrol/crypto/crypto.cpp +@@ -2321,7 +2321,11 @@ bool KCryptoConfig::loadCiphers() { + unsigned int i; + SSL_CTX *ctx; + SSL *ssl; ++#if OPENSSL_VERSION_NUMBER < 0x00909000L + SSL_METHOD *meth; ++#else ++const SSL_METHOD *meth; ++#endif + + SSLv2Box->clear(); + SSLv3Box->clear(); +@@ -2337,8 +2341,10 @@ SSL_METHOD *meth; + CipherItem *item; + for (i=0; ; i++) { + int j, k; +- SSL_CIPHER *sc; +- sc = (meth->get_cipher)(i); ++#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10000000L ++ const ++#endif ++ SSL_CIPHER *sc = (meth->get_cipher)(i); + if (!sc) + break; + // Leak of sc*? +@@ -2365,8 +2371,10 @@ SSL_METHOD *meth; + + for (i=0; ; i++) { + int j, k; +- SSL_CIPHER *sc; +- sc = (meth->get_cipher)(i); ++#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10000000L ++ const ++#endif ++ SSL_CIPHER *sc = (meth->get_cipher)(i); + if (!sc) + break; + // Leak of sc*? diff --git a/opensuse/core/tdebase/optional-compmgr.diff b/opensuse/core/tdebase/optional-compmgr.diff new file mode 100644 index 000000000..d0affeed9 --- /dev/null +++ b/opensuse/core/tdebase/optional-compmgr.diff @@ -0,0 +1,32 @@ +Index: kwin/workspace.cpp +=================================================================== +--- kwin/workspace.cpp.orig ++++ kwin/workspace.cpp +@@ -59,6 +59,17 @@ KSelectionOwner* kompmgr_selection; + + bool allowKompmgrRestart = TRUE; + ++bool supportsCompMgr() ++{ ++ int i; ++ ++ bool damageExt = XQueryExtension(qt_xdisplay(), "DAMAGE", &i, &i, &i); ++ bool compositeExt = XQueryExtension(qt_xdisplay(), "Composite", &i, &i, &i); ++ bool xfixesExt = XQueryExtension(qt_xdisplay(), "XFIXES", &i, &i, &i); ++ ++ return damageExt && compositeExt && xfixesExt; ++} ++ + // Rikkus: This class is too complex. It needs splitting further. + // It's a nightmare to understand, especially with so few comments :( + +@@ -199,6 +210,9 @@ Workspace::Workspace( bool restore ) + connect( kapp->desktop(), SIGNAL( resized( int )), SLOT( desktopResized())); + #endif + ++ if (!supportsCompMgr()) ++ options->useTranslucency = false; ++ + // start kompmgr - i wanted to put this into main.cpp, but that would prevent dcop support, as long as Application was no dcop_object + if (options->useTranslucency) + { diff --git a/opensuse/core/tdebase/quick_browser_menu.diff b/opensuse/core/tdebase/quick_browser_menu.diff new file mode 100644 index 000000000..dd955115c --- /dev/null +++ b/opensuse/core/tdebase/quick_browser_menu.diff @@ -0,0 +1,30 @@ +Index: kicker/kicker/ui/browser_mnu.cpp +=================================================================== +--- kicker/kicker/ui/browser_mnu.cpp.orig ++++ kicker/kicker/ui/browser_mnu.cpp +@@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <kfileitem.h> + #include <kglobal.h> + #include <kglobalsettings.h> ++#include <kconfig.h> + #include <kiconloader.h> + #include <kio/global.h> + #include <klocale.h> +@@ -148,12 +149,14 @@ void PanelBrowserMenu::initialize() + // only the first part menu got them + if(_startid == 0 && !_filesOnly) { + insertTitle(path()); ++ KConfig *c = KGlobal::config(); ++ c->setGroup("menus"); + insertItem(CICON("kfm"), i18n("Open in File Manager"), this, SLOT(slotOpenFileManager())); +- if (kapp->authorize("shell_access")) +- insertItem(CICON("terminal"), i18n("Open in Terminal"), this, SLOT(slotOpenTerminal())); ++ if (kapp->authorize("shell_access") && c->readBoolEntry("kickerOpenInTerminalIsVisible",false)) ++ insertItem(CICON("terminal"), i18n("Open in Terminal"), this, SLOT(slotOpenTerminal())); ++ insertSeparator(); + } + +- + bool first_entry = true; + bool dirfile_separator = false; + unsigned int item_count = 0; diff --git a/opensuse/core/tdebase/remove-beagle-stuff.diff b/opensuse/core/tdebase/remove-beagle-stuff.diff new file mode 100644 index 000000000..94b243d9d --- /dev/null +++ b/opensuse/core/tdebase/remove-beagle-stuff.diff @@ -0,0 +1,34 @@ +a "make it compile " patch from Stephan Binner + +--- kicker/kicker/plugins/beaglesearch.cpp ++++ kicker/kicker/plugins/beaglesearch.cpp +@@ -291,11 +291,11 @@ + beagle_query_set_max_hits (beagle_query, max_hits_per_source); // this is per source! + + kdDebug () << "Creating query from \"" << query_str << "\"" << endl; +- for ( QStringList::Iterator it = sources_menu.begin(); it != sources_menu.end(); ++it ) ++ /* for ( QStringList::Iterator it = sources_menu.begin(); it != sources_menu.end(); ++it ) + beagle_query_add_source (beagle_query, g_strdup ((*it).utf8 ())); + + for ( QStringList::Iterator it = types_menu.begin(); it != types_menu.end(); ++it ) +- beagle_query_add_hit_type (beagle_query, g_strdup ((*it).utf8 ())); ++ beagle_query_add_hit_type (beagle_query, g_strdup ((*it).utf8 ()));*/ + + QStringList query_terms; + QString start_date, end_date; +@@ -307,13 +307,13 @@ + else if (key_value_pair.count () == 2) { + QString key = key_value_pair [0].lower (); + QString value = key_value_pair [1]; +- if (key == "mime") ++ if /*(key == "mime") + beagle_query_add_mime_type (beagle_query, g_strdup (value.utf8 ())); + else if (key == "type") + beagle_query_add_hit_type (beagle_query, g_strdup (value.utf8 ())); + else if (key == "source") + beagle_query_add_source (beagle_query, g_strdup (value.utf8 ())); +- else if (key == "start") ++ else if */ (key == "start") + start_date = value; + else if (key == "end") + end_date = value; diff --git a/opensuse/core/tdebase/restore-description-parens.diff b/opensuse/core/tdebase/restore-description-parens.diff new file mode 100644 index 000000000..f575dbcb2 --- /dev/null +++ b/opensuse/core/tdebase/restore-description-parens.diff @@ -0,0 +1,13 @@ +Index: kicker/kicker/ui/service_mnu.cpp +=================================================================== +--- kicker/kicker/ui/service_mnu.cpp.orig ++++ kicker/kicker/ui/service_mnu.cpp +@@ -426,7 +426,7 @@ void PanelServiceMenu::insertMenuItem(KS + { + if (comment.find(serviceName, 0, true) == -1) + { +- serviceName = i18n("Entries in K-menu: %1 app name, %2 description", "%1 - %2").arg(serviceName, comment); ++ serviceName = i18n("Entries in K-menu: %1 app name, %2 description", "%1 (%2)").arg(serviceName, comment); + } + else + { diff --git a/opensuse/core/tdebase/rotate-wacom-pointers.diff b/opensuse/core/tdebase/rotate-wacom-pointers.diff new file mode 100644 index 000000000..a8d9c7f96 --- /dev/null +++ b/opensuse/core/tdebase/rotate-wacom-pointers.diff @@ -0,0 +1,291 @@ +--- kcontrol/randr/legacyrandrscreen.cpp ++++ kcontrol/randr/legacyrandrscreen.cpp +@@ -30,6 +30,8 @@ + #include <kiconloader.h> + #include <qlabel.h> + #include <qdesktopwidget.h> ++#include <kprocess.h> ++#include <kstandarddirs.h> + + #include "ktimerdialog.h" + #include "legacyrandrscreen.h" +@@ -103,12 +105,55 @@ bool LegacyRandRScreen::applyProposed() + m_currentSize = m_proposedSize; + m_currentRotation = m_proposedRotation; + m_currentRefreshRate = m_proposedRefreshRate; ++ ++ // search wacom utility and set orientation for available wacom pointers ++ QString xsetwacom = KStandardDirs::findExe("xsetwacom"); ++ if (!xsetwacom.isEmpty()) { ++ m_wacomPointers.clear(); ++ KProcess *proc = new KProcess; ++ connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(gotAvailablePointers(KProcess *, char *, int))); ++ *proc << "xsetwacom" << "list"; ++ if (!proc->start(KProcess::Block,KProcess::Stdout)) ++ kdError("Could not ask xsetwacom for available pointers."); ++ else { ++ for ( QStringList::Iterator it = m_wacomPointers.begin(); it != m_wacomPointers.end(); ++it ) { ++ KProcess *set = new KProcess; ++ *set << "xsetwacom" << "set" << (*it) << "Rotate"; ++ switch (m_currentRotation) { ++ case RR_Rotate_90: ++ *set << "CW"; ++ break; ++ case RR_Rotate_180: ++ *set << "HALF"; ++ break; ++ case RR_Rotate_270: ++ *set << "CCW"; ++ break; ++ default: ++ *set << "NONE"; ++ } ++ if (!set->start()) ++ kdError("Could not set orientation for wacom pointers."); ++ } ++ } ++ } ++ + return true; + } + + return false; + } + ++void LegacyRandRScreen::gotAvailablePointers(KProcess*, char *buffer, int len) ++{ ++ QString myBuf = QString::fromLatin1(buffer, len); ++ QStringList lines = QStringList::split('\n', myBuf); ++ for ( QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { ++ QStringList split = QStringList::split(' ', (*it)); ++ m_wacomPointers+=split.first(); ++ } ++} ++ + bool LegacyRandRScreen::applyProposedAndConfirm() + { + if (proposedChanged()) { +--- kcontrol/randr/legacyrandrscreen.h ++++ kcontrol/randr/legacyrandrscreen.h +@@ -30,6 +30,7 @@ + #include "randr.h" + + class KTimerDialog; ++class KProcess; + + class LegacyRandRScreen : public QObject + { +@@ -135,6 +136,9 @@ public: + void load(KConfig& config); + void save(KConfig& config) const; + ++private slots: ++ void gotAvailablePointers(KProcess*, char *buffer, int len); ++ + private: + XRRScreenConfiguration* m_config; + +@@ -156,6 +160,8 @@ private: + int m_proposedSize; + int m_proposedRefreshRate; + ++ QStringList m_wacomPointers; ++ + KTimerDialog* m_shownDialog; + + }; +--- kcontrol/randr/randrscreen.cpp ++++ kcontrol/randr/randrscreen.cpp +@@ -18,6 +18,8 @@ + + #include <kdebug.h> + #include <kconfig.h> ++#include <kprocess.h> ++#include <kstandarddirs.h> + #include "randrscreen.h" + #include "randrcrtc.h" + #include "randroutput.h" +@@ -429,6 +431,40 @@ bool RandRScreen::applyProposed(bool confirm) + if (succeed && confirm) + succeed = RandR::confirm(r); + ++ if (succeed) { ++ // search wacom utility and set orientation for available wacom pointers ++ QString xsetwacom = KStandardDirs::findExe("xsetwacom"); ++ if (!xsetwacom.isEmpty()) { ++ m_wacomPointers.clear(); ++ KProcess *proc = new KProcess; ++ connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(gotAvailablePointers(KProcess *, char *, int))); ++ *proc << "xsetwacom" << "list"; ++ if (!proc->start(KProcess::Block,KProcess::Stdout)) ++ kdError("Could not ask xsetwacom for available pointers."); ++ else { ++ for ( QStringList::Iterator it = m_wacomPointers.begin(); it != m_wacomPointers.end(); ++it ) { ++ KProcess *set = new KProcess; ++ *set << "xsetwacom" << "set" << (*it) << "Rotate"; ++ switch (m_unifiedRotation) { ++ case RR_Rotate_90: ++ *set << "CW"; ++ break; ++ case RR_Rotate_180: ++ *set << "HALF"; ++ break; ++ case RR_Rotate_270: ++ *set << "CCW"; ++ break; ++ default: ++ *set << "NONE"; ++ } ++ if (!set->start()) ++ kdError("Could not set orientation for wacom pointers."); ++ } ++ } ++ } ++ } ++ + // if we succeded applying and the user confirmer the changes, + // just return from here + if (succeed) +@@ -447,6 +483,16 @@ bool RandRScreen::applyProposed(bool confirm) + return false; + } + ++void RandRScreen::gotAvailablePointers(KProcess*, char *buffer, int len) ++{ ++ QString myBuf = QString::fromLatin1(buffer, len); ++ QStringList lines = QStringList::split('\n', myBuf); ++ for ( QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { ++ QStringList split = QStringList::split(' ', (*it)); ++ m_wacomPointers+=split.first(); ++ } ++} ++ + void RandRScreen::unifyOutputs() + { + SizeList sizes = unifiedSizes(); +--- kcontrol/randr/randrscreen.h ++++ kcontrol/randr/randrscreen.h +@@ -29,6 +29,7 @@ + + class QAction; + class KConfig; ++class KProcess; + + class RandRScreen : public QObject + { +@@ -95,6 +96,9 @@ public slots: + void save(); + void load(); + ++private slots: ++ void gotAvailablePointers(KProcess*, char *buffer, int len); ++ + signals: + void configChanged(); + +@@ -119,7 +123,7 @@ private: + CrtcMap m_crtcs; + OutputMap m_outputs; + ModeMap m_modes; +- ++ QStringList m_wacomPointers; + }; + #endif + +--- kcontrol/randr/randrcrtc.cpp ++++ kcontrol/randr/randrcrtc.cpp +@@ -17,6 +17,8 @@ + */ + + #include <kdebug.h> ++#include <kprocess.h> ++#include <kstandarddirs.h> + #include "randrcrtc.h" + #include "randrscreen.h" + #include "randroutput.h" +@@ -298,6 +300,38 @@ + m_currentRate = mode.refreshRate(); + emit crtcChanged(m_id, RandR::ChangeMode); + ret = true; ++ ++ // search wacom utility and set orientation for available wacom pointers ++ QString xsetwacom = KStandardDirs::findExe("xsetwacom"); ++ if (!xsetwacom.isEmpty()) { ++ m_wacomPointers.clear(); ++ KProcess *proc = new KProcess; ++ connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(gotAvailablePointers(KProcess *, char *, int))); ++ *proc << "xsetwacom" << "list"; ++ if (!proc->start(KProcess::Block,KProcess::Stdout)) ++ kdError("Could not ask xsetwacom for available pointers."); ++ else { ++ for ( QStringList::Iterator it = m_wacomPointers.begin(); it != m_wacomPointers.end(); ++it ) { ++ KProcess *set = new KProcess; ++ *set << "xsetwacom" << "set" << (*it) << "Rotate"; ++ switch (m_currentRotation) { ++ case RR_Rotate_90: ++ *set << "CW"; ++ break; ++ case RR_Rotate_180: ++ *set << "HALF"; ++ break; ++ case RR_Rotate_270: ++ *set << "CCW"; ++ break; ++ default: ++ *set << "NONE"; ++ } ++ if (!set->start()) ++ kdError("Could not set orientation for wacom pointers."); ++ } ++ } ++ } + } + else + { +@@ -309,6 +343,16 @@ + return ret; + } + ++void RandRCrtc::gotAvailablePointers(KProcess*, char *buffer, int len) ++{ ++ QString myBuf = QString::fromLatin1(buffer, len); ++ QStringList lines = QStringList::split('\n', myBuf); ++ for ( QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { ++ QStringList split = QStringList::split(' ', (*it)); ++ m_wacomPointers+=split.first(); ++ } ++} ++ + bool RandRCrtc::proposeSize(QSize s) + { + m_proposedRect.setSize(s); +--- kcontrol/randr/randrcrtc.h ++++ kcontrol/randr/randrcrtc.h +@@ -26,6 +26,8 @@ + + #ifdef HAS_RANDR_1_2 + ++class KProcess; ++ + class RandRCrtc : public QObject + { + Q_OBJECT +@@ -62,6 +64,9 @@ + + ModeList modes() const; + ++private slots: ++ void gotAvailablePointers(KProcess*, char *buffer, int len); ++ + signals: + void crtcChanged(RRCrtc c, int changes); + +@@ -86,6 +91,8 @@ + float m_currentRate; + + RandRScreen *m_screen; ++ ++ QStringList m_wacomPointers; + }; + #endif + diff --git a/opensuse/core/tdebase/runupdater.patch b/opensuse/core/tdebase/runupdater.patch new file mode 100644 index 000000000..3dcc4c550 --- /dev/null +++ b/opensuse/core/tdebase/runupdater.patch @@ -0,0 +1,133 @@ +Index: runupdater/runupdater.desktop +=================================================================== +--- /dev/null ++++ runupdater/runupdater.desktop +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Type=Application ++Exec=runupdater ++Terminal=false ++Name=Run Updater Tool ++Icon=www ++ ++X-KDE-StartupNotify=false ++OnlyShowIn=KDE; +Index: runupdater/runupdater.cpp +=================================================================== +--- /dev/null ++++ runupdater/runupdater.cpp +@@ -0,0 +1,96 @@ ++/* ++ Run either opensuseupdater or zen-updater but not both. ++ For opensuseupdater its autostart condition is checked, for zen-updater ++ it's checked whether its autostart file is enabled. ++*/ ++ ++#include <kapplication.h> ++#include <kconfig.h> ++#include <ksimpleconfig.h> ++#include <kstandarddirs.h> ++ ++static bool disabledOSU() ++ { ++ KConfig osu( "opensuseupdaterrc", true ); ++ osu.setGroup( "General" ); ++// fprintf( stderr, "OSU:%d\n", osu.readBoolEntry ("Autostart", true )); ++ return !osu.readBoolEntry( "Autostart", true ); ++ } ++ ++static bool availableOSU() ++ { ++ return !KStandardDirs::findExe( "opensuseupdater" ).isEmpty(); ++ } ++ ++static bool runOSU() ++ { ++ return KApplication::kdeinitExec( "opensuseupdater", QStringList(), NULL, NULL, "0" ) == 0; ++ } ++ ++static bool disabledZU() ++ { ++ KConfig zu( "zen-updater-auto.desktop", true, false, "xdgconf-autostart" ); ++ zu.setGroup( "Desktop Entry" ); ++// fprintf( stderr, "ZU %d\n", zu.readBoolEntry( "Hidden", false ) ); ++ return zu.readBoolEntry( "Hidden", false ); ++ } ++ ++static bool availableZU() ++ { ++ return !KStandardDirs::findExe( "zen-updater" ).isEmpty(); ++ } ++ ++static bool runZU() ++ { ++ return KApplication::kdeinitExec( "zen-updater", QStringList(), NULL, NULL, "0" ) == 0; ++ } ++ ++extern "C" ++int kdemain() ++ { ++ KInstance inst( "runupdater" ); ++ // KSimpleConfig should parse this one just fine, with entries in the default group ++ KSimpleConfig sysconfig( "/etc/sysconfig/sw_management", true ); ++ QString preferred = sysconfig.readEntry( "PREFERRED_SW_MANAGER_STACK" ); ++// fprintf( stderr, "SC1: %s\n", preferred.latin1()); ++ if( preferred.startsWith( "\"" ) && preferred.endsWith( "\"" )) // strip "" ++ preferred = preferred.mid( 1, preferred.length() - 2 ); ++// fprintf( stderr, "SC2: %s\n", preferred.latin1()); ++ if( preferred.lower() == "opensuse" ) ++ { ++ // opensuseupdater preferred - it's it's available, run it if it's enabled, ++ // try zen-updater only if opensuseupdater is not available at all ++ if( availableOSU()) ++ { ++ if( !disabledOSU()) ++ return runOSU(); ++ return 0; ++ } ++ else if( availableZU() && !disabledZU()) ++ return runZU(); ++ return 0; ++ } ++ else if( preferred.lower() == "zlm" ) ++ { ++ // similar like above, just the other way around ++ if( availableZU()) ++ { ++ if( !disabledZU()) ++ return runZU(); ++ return 0; ++ } ++ else if( availableOSU() && !disabledOSU()) ++ return runOSU(); ++ return 0; ++ } ++ else ++ { ++ // prefer opensuseupdater, but try to run zen-updater if opensuseupdater is not run ++ // the difference is that zen-updater is still run if opensuseupdater is disabled ++ if( availableOSU() && !disabledOSU() && runOSU()) ++ return 0; ++ if( availableZU() && !disabledZU() && runZU()) ++ return 0; ++ return 0; ++ } ++ } +Index: runupdater/Makefile.am +=================================================================== +--- /dev/null ++++ runupdater/Makefile.am +@@ -0,0 +1,13 @@ ++INCLUDES = $(all_includes) ++ ++bin_PROGRAMS = ++lib_LTLIBRARIES = ++kdeinit_LTLIBRARIES = runupdater.la ++ ++runupdater_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) ++runupdater_la_LIBADD = $(LIB_KDECORE) ++ ++runupdater_la_SOURCES = runupdater.cpp ++ ++autostart_DATA = runupdater.desktop ++autostartdir = $(datadir)/autostart diff --git a/opensuse/core/tdebase/select-wm-gui.diff b/opensuse/core/tdebase/select-wm-gui.diff new file mode 100644 index 000000000..823262962 --- /dev/null +++ b/opensuse/core/tdebase/select-wm-gui.diff @@ -0,0 +1,635 @@ +Subject: GUI configuration for selecting WM +From: Lubos Lunak +Feature: bnc#332079 +Patch-upstream: no + +Index: ksmserver/startup.cpp +=================================================================== +--- ksmserver/startup.cpp.orig ++++ ksmserver/startup.cpp +@@ -103,38 +103,39 @@ void KSMServer::restoreSession( QString + config->setGroup( sessionGroup ); + int count = config->readNumEntry( "count" ); + appsToStart = count; +- +- QValueList<QStringList> wmCommands; +- if ( !wm.isEmpty() ) { +- for ( int i = 1; i <= count; i++ ) { +- QString n = QString::number(i); +- if ( wm == config->readEntry( QString("program")+n ) ) { +- wmCommands << config->readListEntry( QString("restartCommand")+n ); +- } +- } +- } +- if ( wmCommands.isEmpty() ) +- wmCommands << ( QStringList() << wm ); +- + publishProgress( appsToStart, true ); ++ upAndRunning( "ksmserver" ); + connectDCOPSignal( launcher, launcher, "autoStart0Done()", + "autoStart0Done()", true); + connectDCOPSignal( launcher, launcher, "autoStart1Done()", + "autoStart1Done()", true); + connectDCOPSignal( launcher, launcher, "autoStart2Done()", + "autoStart2Done()", true); +- upAndRunning( "ksmserver" ); + +- if ( !wmCommands.isEmpty() ) { +- // when we have a window manager, we start it first and give +- // it some time before launching other processes. Results in a +- // visually more appealing startup. +- for (uint i = 0; i < wmCommands.count(); i++) +- startApplication( wmCommands[i] ); +- QTimer::singleShot( 4000, this, SLOT( autoStart0() ) ); +- } else { +- autoStart0(); ++ // find all commands to launch the wm in the session ++ QValueList<QStringList> wmStartCommands; ++ if ( !wm.isEmpty() ) { ++ for ( int i = 1; i <= count; i++ ) { ++ QString n = QString::number(i); ++ // special hack for it, both kde3(=native) and kde4 kwin have the same program, ++ // but the command for kde4 kwin starts with the kde4 wrapper ++ if( config->readEntry( QString("program")+n ) == "kwin" ) { ++ QStringList command = config->readListEntry( QString("restartCommand")+n ); ++ if( wmCommands.count() > 1 && wmCommands[ 0 ].endsWith( "kde4" ) ++ && command.count() > 1 && command[ 0 ].endsWith( "kde4" )) { ++ wmStartCommands << command; // kde4 wanted, kde4 found ++ } else if(!( wmCommands.count() > 1 && wmCommands[ 0 ].endsWith( "kde4" )) ++ && !( command.count() > 1 && command[ 0 ].endsWith( "kde4" ))) { ++ wmStartCommands << command; // native wanted, native found ++ } ++ } else if ( wm == config->readEntry( QString("program")+n ) ) { ++ wmStartCommands << config->readListEntry( QString("restartCommand")+n ); ++ } ++ } + } ++ if( wmStartCommands.isEmpty()) // otherwise use the configured default ++ wmStartCommands << wmCommands; ++ launchWM( wmStartCommands ); + } + + /*! +@@ -157,17 +158,53 @@ void KSMServer::startDefaultSession() + "autoStart1Done()", true); + connectDCOPSignal( launcher, launcher, "autoStart2Done()", + "autoStart2Done()", true); +- startApplication( wm ); ++ launchWM( QValueList< QStringList >() << wmCommands ); ++} ++ ++void KSMServer::launchWM( const QValueList< QStringList >& wmStartCommands ) ++{ ++ assert( state == LaunchingWM ); ++ ++ // when we have a window manager, we start it first and give ++ // it some time before launching other processes. Results in a ++ // visually more appealing startup. ++ wmProcess = startApplication( wmStartCommands[ 0 ] ); ++ connect( wmProcess, SIGNAL( processExited( KProcess* )), SLOT( wmProcessChange())); ++ // there can be possibly more wm's (because of forking for multihead), ++ // but in such case care only about the process of the first one ++ for (unsigned int i = 1; i < wmStartCommands.count(); i++) ++ startApplication( wmStartCommands[i] ); + QTimer::singleShot( 4000, this, SLOT( autoStart0() ) ); + } + + + void KSMServer::clientSetProgram( KSMClient* client ) + { +- if ( !wm.isEmpty() && client->program() == wm ) ++ if ( client->program() == wm ) + autoStart0(); + } + ++void KSMServer::wmProcessChange() ++{ ++ if( state != LaunchingWM ) ++ { // don't care about the process when not in the wm-launching state anymore ++ wmProcess = NULL; ++ return; ++ } ++ if( !wmProcess->isRunning()) ++ { // wm failed to launch for some reason, go with kwin instead ++ kdWarning( 1218 ) << "Window manager '" << wm << "' failed to launch" << endl; ++ if( wm == "kwin" ) ++ return; // uhoh, kwin itself failed ++ kdDebug( 1218 ) << "Launching KWin" << endl; ++ wm = "kwin"; ++ wmCommands = ( QStringList() << "kwin" ); ++ // launch it ++ launchWM( QValueList< QStringList >() << wmCommands ); ++ return; ++ } ++} ++ + void KSMServer::autoStart0() + { + if( state != LaunchingWM ) +Index: ksmserver/server.h +=================================================================== +--- ksmserver/server.h.orig ++++ ksmserver/server.h +@@ -30,6 +30,8 @@ Copyright (C) 2000 Matthias Ettrich <ett + #define SESSION_PREVIOUS_LOGOUT "saved at previous logout" + #define SESSION_BY_USER "saved by user" + ++class KProcess; ++ + typedef QValueList<QCString> QCStringList; + class KSMListener; + class KSMConnection; +@@ -98,6 +100,8 @@ public: + KApplication::ShutdownType sdtype, + KApplication::ShutdownMode sdmode ); + ++ void launchWM( const QValueList< QStringList >& wmStartCommands ); ++ + public slots: + void cleanUp(); + +@@ -120,6 +124,7 @@ private slots: + void autoStart2(); + void tryRestoreNext(); + void startupSuspendTimeout(); ++ void wmProcessChange(); + + private: + void handlePendingInteractions(); +@@ -138,13 +143,14 @@ private: + void startProtection(); + void endProtection(); + +- void startApplication( QStringList command, ++ KProcess* startApplication( QStringList command, + const QString& clientMachine = QString::null, + const QString& userId = QString::null ); + void executeCommand( const QStringList& command ); + + bool isWM( const KSMClient* client ) const; + bool isWM( const QString& program ) const; ++ void selectWm( const QString& kdewm ); + bool defaultSession() const; // empty session + void setupXIOErrorHandler(); + +@@ -223,6 +229,8 @@ private: + int lastAppStarted; + QString lastIdStarted; + ++ QStringList wmCommands; ++ KProcess* wmProcess; + QStringList excludeApps; + + WindowMap legacyWindows; +Index: ksmserver/Makefile.am +=================================================================== +--- ksmserver/Makefile.am.orig ++++ ksmserver/Makefile.am +@@ -15,7 +15,7 @@ + # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-SUBDIRS = . ++SUBDIRS = . windowmanagers + + INCLUDES= -I$(top_srcdir)/kdmlib $(all_includes) $(DBUS_INCS) + +Index: ksmserver/main.cpp +=================================================================== +--- ksmserver/main.cpp.orig ++++ ksmserver/main.cpp +@@ -203,8 +203,6 @@ extern "C" KDE_EXPORT int kdemain( int a + } + + QCString wm = args->getOption("windowmanager"); +- if ( wm.isEmpty() ) +- wm = "kwin"; + + bool only_local = args->isSet("local"); + #ifndef HAVE__ICETRANSNOLISTEN +Index: ksmserver/server.cpp +=================================================================== +--- ksmserver/server.cpp.orig ++++ ksmserver/server.cpp +@@ -77,6 +77,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE + #include <kprocess.h> + #include <dcopclient.h> + #include <dcopref.h> ++#include <kdesktopfile.h> ++#include <kshell.h> + + #include "server.h" + #include "global.h" +@@ -98,11 +100,11 @@ KSMServer* KSMServer::self() + /*! Utility function to execute a command on the local machine. Used + * to restart applications. + */ +-void KSMServer::startApplication( QStringList command, const QString& clientMachine, ++KProcess* KSMServer::startApplication( QStringList command, const QString& clientMachine, + const QString& userId ) + { + if ( command.isEmpty() ) +- return; ++ return NULL; + if ( !userId.isEmpty()) { + struct passwd* pw = getpwuid( getuid()); + if( pw != NULL && userId != QString::fromLocal8Bit( pw->pw_name )) { +@@ -116,12 +118,12 @@ void KSMServer::startApplication( QStrin + command.prepend( clientMachine ); + command.prepend( xonCommand ); // "xon" by default + } +- int n = command.count(); +- QCString app = command[0].latin1(); +- QValueList<QCString> argList; +- for ( int i=1; i < n; i++) +- argList.append( QCString(command[i].latin1())); +- DCOPRef( launcher ).send( "exec_blind", app, DCOPArg( argList, "QValueList<QCString>" ) ); ++ KProcess* process = new KProcess( this ); ++ *process << command; ++ // make it auto-delete ++ connect( process, SIGNAL( processExited( KProcess* )), process, SLOT( deleteLater())); ++ process->start(); ++ return process; + } + + /*! Utility function to execute a command on the local machine. Used +@@ -580,10 +582,10 @@ extern "C" int _IceTransNoListen(const c + + KSMServer::KSMServer( const QString& windowManager, bool _only_local ) + : DCOPObject("ksmserver"), sessionGroup( "" ) ++ , wmProcess( NULL ) + { + the_server = this; + clean = false; +- wm = windowManager; + + shutdownType = KApplication::ShutdownTypeNone; + +@@ -595,6 +597,9 @@ KSMServer::KSMServer( const QString& win + config->setGroup("General" ); + clientInteracting = 0; + xonCommand = config->readEntry( "xonCommand", "xon" ); ++ ++ KGlobal::dirs()->addResourceType( "windowmanagers", "share/apps/ksmserver/windowmanagers" ); ++ selectWm( windowManager ); + + connect( &knotifyTimeoutTimer, SIGNAL( timeout()), SLOT( knotifyTimeout())); + connect( &startupSuspendTimeoutTimer, SIGNAL( timeout()), SLOT( startupSuspendTimeout())); +@@ -851,14 +856,12 @@ void KSMServer::storeSession() + config->setGroup( sessionGroup ); + count = 0; + +- if ( !wm.isEmpty() ) { +- // put the wm first +- for ( KSMClient* c = clients.first(); c; c = clients.next() ) +- if ( c->program() == wm ) { +- clients.prepend( clients.take() ); +- break; +- } +- } ++ // put the wm first ++ for ( KSMClient* c = clients.first(); c; c = clients.next() ) ++ if ( c->program() == wm ) { ++ clients.prepend( clients.take() ); ++ break; ++ } + + for ( KSMClient* c = clients.first(); c; c = clients.next() ) { + int restartHint = c->restartStyleHint(); +@@ -909,14 +912,65 @@ bool KSMServer::isWM( const KSMClient* c + + bool KSMServer::isWM( const QString& program ) const + { +- // KWin relies on ksmserver's special treatment in phase1, +- // therefore make sure it's recognized even if ksmserver +- // was initially started with different WM, and kwin replaced +- // it later +- return program == wm || program == "kwin"; ++ return program == wm; + } + + bool KSMServer::defaultSession() const + { + return sessionGroup.isEmpty(); + } ++ ++static bool noDisplay( KDesktopFile& f ) ++{ ++ KConfigGroup gr( &f, "Desktop Entry" ); ++ if (gr.readBoolEntry("NoDisplay", false)) { ++ return true; ++ } ++ if (gr.hasKey("OnlyShowIn")) { ++ if (!gr.readListEntry("OnlyShowIn", ';').contains("KDE")) ++ return true; ++ } ++ if (gr.hasKey("NotShowIn")) { ++ if (gr.readListEntry("NotShowIn", ';').contains("KDE")) ++ return true; ++ } ++ return false; ++} ++ ++// selection logic: ++// - $KDEWM is set - use that ++// - a wm is selected using the kcm - use that ++// - if that fails, just use KWin ++void KSMServer::selectWm( const QString& kdewm ) ++{ ++ wm = "kwin"; // defaults ++ wmCommands = ( QStringList() << "kwin" ); ++ if( !kdewm.isEmpty()) ++ { ++ wmCommands = ( QStringList() << kdewm ); ++ wm = kdewm; ++ return; ++ } ++ KConfigGroup config(KGlobal::config(), "General"); ++ QString cfgwm = config.readEntry( "windowManager", "kwin" ); ++ KDesktopFile file( cfgwm + ".desktop", true, "windowmanagers" ); ++ if( noDisplay( file )) ++ return; ++ if( !file.tryExec()) ++ return; ++ file.setDesktopGroup(); ++ QString testexec = file.readEntry( "X-KDE-WindowManagerTestExec" ); ++ if( !testexec.isEmpty()) ++ { ++ int ret = system( QFile::encodeName( testexec )); ++ if( !WIFEXITED( ret ) || WEXITSTATUS( ret ) != 0 ) ++ return; ++ } ++ QStringList cfgWmCommands = KShell::splitArgs( file.readEntry( "Exec" )); ++ if( cfgWmCommands.isEmpty()) ++ return; ++ QString smname = file.readEntry( "X-KDE-WindowManagerId" ); ++ // ok ++ wm = smname.isEmpty() ? cfgwm : smname; ++ wmCommands = cfgWmCommands; ++} +Index: ksmserver/windowmanagers/openbox.desktop +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/openbox.desktop +@@ -0,0 +1,5 @@ ++[Desktop Entry] ++Name=Openbox ++Exec=openbox ++TryExec=openbox ++ +Index: ksmserver/windowmanagers/Makefile.am +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/Makefile.am +@@ -0,0 +1,2 @@ ++windowmanager_DATA = compiz-custom.desktop compiz.desktop kwin4.desktop metacity.desktop openbox.desktop ++windowmanagerdir = $(kde_datadir)/ksmserver/windowmanagers +Index: ksmserver/windowmanagers/compiz.desktop +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/compiz.desktop +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Name=Compiz ++Exec=compiz ccp ++TryExec=compiz +Index: ksmserver/windowmanagers/compiz-custom.desktop +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/compiz-custom.desktop +@@ -0,0 +1,5 @@ ++[Desktop Entry] ++Name=Compiz custom (create wrapper script 'compiz-kde-launcher' to launch it) ++Exec=compiz-kde-launcher ++TryExec=compiz ++X-KDE-WindowManagerId=compiz +Index: ksmserver/windowmanagers/kwin4.desktop +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/kwin4.desktop +@@ -0,0 +1,6 @@ ++[Desktop Entry] ++Name=KWin (KDE4) ++Exec=kde4 /usr/bin/kwin ++TryExec=/usr/bin/kwin ++X-KDE-WindowManagerId=kwin ++ +Index: ksmserver/windowmanagers/metacity.desktop +=================================================================== +--- /dev/null ++++ ksmserver/windowmanagers/metacity.desktop +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Name=Metacity (GNOME) ++Exec=metacity ++TryExec=metacity +Index: kcontrol/smserver/smserverconfigdlg.ui +=================================================================== +--- kcontrol/smserver/smserverconfigdlg.ui.orig ++++ kcontrol/smserver/smserverconfigdlg.ui +@@ -1,4 +1,4 @@ +-<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> ++<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> + <class>SMServerConfigDlg</class> + <widget class="QWidget"> + <property name="name"> +@@ -8,8 +8,8 @@ + <rect> + <x>0</x> + <y>0</y> +- <width>325</width> +- <height>366</height> ++ <width>334</width> ++ <height>476</height> + </rect> + </property> + <property name="caption"> +@@ -148,6 +148,24 @@ + </widget> + </vbox> + </widget> ++ <widget class="QGroupBox"> ++ <property name="name"> ++ <cstring>windowManagerGroup</cstring> ++ </property> ++ <property name="title"> ++ <string>Window Manager</string> ++ </property> ++ <hbox> ++ <property name="name"> ++ <cstring>unnamed</cstring> ++ </property> ++ <widget class="QComboBox"> ++ <property name="name"> ++ <cstring>windowManagerCombo</cstring> ++ </property> ++ </widget> ++ </hbox> ++ </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>advancedGroup</cstring> +@@ -236,6 +254,12 @@ + <receiver>SMServerConfigDlg</receiver> + <slot>configChanged()</slot> + </connection> ++ <connection> ++ <sender>windowManagerCombo</sender> ++ <signal>activated(int)</signal> ++ <receiver>SMServerConfigDlg</receiver> ++ <slot>configChanged()</slot> ++ </connection> + </connections> + <includes> + <include location="global" impldecl="in implementation">kdialog.h</include> +Index: kcontrol/smserver/kcmsmserver.cpp +=================================================================== +--- kcontrol/smserver/kcmsmserver.cpp.orig ++++ kcontrol/smserver/kcmsmserver.cpp +@@ -22,6 +22,8 @@ + #include <qcheckbox.h> + #include <qlayout.h> + #include <qradiobutton.h> ++#include <qcombobox.h> ++#include <qfile.h> + + #include <dcopclient.h> + +@@ -29,6 +31,12 @@ + #include <kconfig.h> + #include <kgenericfactory.h> + #include <klineedit.h> ++#include <kstandarddirs.h> ++#include <qregexp.h> ++#include <kdesktopfile.h> ++#include <kdebug.h> ++#include <kprocess.h> ++#include <kmessagebox.h> + + #include "kcmsmserver.h" + #include "smserverconfigimpl.h" +@@ -52,6 +60,7 @@ SMServerConfig::SMServerConfig( QWidget + + dialog->show(); + topLayout->add(dialog); ++ KGlobal::dirs()->addResourceType( "windowmanagers", "share/apps/ksmserver/windowmanagers" ); + load(); + + } +@@ -90,6 +99,7 @@ void SMServerConfig::load(bool useDefaul + dialog->logoutRadio->setChecked(true); + break; + } ++ loadWMs(c->readEntry("windowManager", "kwin")); + dialog->excludeLineedit->setText( c->readEntry("excludeApps")); + + delete c; +@@ -116,6 +126,7 @@ void SMServerConfig::save() + dialog->rebootRadio->isChecked() ? + int(KApplication::ShutdownTypeReboot) : + int(KApplication::ShutdownTypeNone)); ++ c->writeEntry("windowManager", currentWM()); + c->writeEntry("excludeApps", dialog->excludeLineedit->text()); + c->sync(); + delete c; +@@ -123,6 +134,12 @@ void SMServerConfig::save() + // update the k menu if necessary + QByteArray data; + kapp->dcopClient()->send( "kicker", "kicker", "configure()", data ); ++ if( oldwm != currentWM()) ++ { // TODO switch it already in the session instead and tell ksmserver ++ KMessageBox::information( this, ++ i18n( "The new window manager will be used when KDE is started the next time." ), ++ i18n( "Window manager change" ), "windowmanagerchange" ); ++ } + } + + void SMServerConfig::defaults() +@@ -130,5 +147,72 @@ void SMServerConfig::defaults() + load( true ); + } + ++static bool noDisplay( KDesktopFile& f ) ++{ ++ KConfigGroup gr( &f, "Desktop Entry" ); ++ if (gr.readBoolEntry("NoDisplay", false)) { ++ return true; ++ } ++ if (gr.hasKey("OnlyShowIn")) { ++ if (!gr.readListEntry("OnlyShowIn", ';').contains("KDE")) ++ return true; ++ } ++ if (gr.hasKey("NotShowIn")) { ++ if (gr.readListEntry("NotShowIn", ';').contains("KDE")) ++ return true; ++ } ++ return false; ++} ++ ++void SMServerConfig::loadWMs( const QString& current ) ++{ ++ QString kwinname = i18n( "KWin (KDE default)" ); ++ dialog->windowManagerCombo->insertItem( kwinname ); ++ dialog->windowManagerCombo->setCurrentItem( 0 ); ++ wms[ kwinname ] = "kwin"; ++ oldwm = "kwin"; ++ QStringList list = KGlobal::dirs()->findAllResources( "windowmanagers", QString(), false, true ); ++ QRegExp reg( ".*/([^/\\.]*)\\.[^/\\.]*" ); ++ for( QStringList::ConstIterator it = list.begin(); ++ it != list.end(); ++ ++it ) ++ { ++ QString wmfile = *it; ++ KDesktopFile file( wmfile ); ++ if( noDisplay( file )) ++ continue; ++ if( !file.tryExec()) ++ continue; ++ file.setDesktopGroup(); ++ QString testexec = file.readEntry( "X-KDE-WindowManagerTestExec" ); ++ if( !testexec.isEmpty()) ++ { ++ int ret = system( QFile::encodeName( testexec )); ++ if( !WIFEXITED( ret ) || WEXITSTATUS( ret ) != 0 ) ++ continue; ++ } ++ QString name = file.readName(); ++ if( name.isEmpty()) ++ continue; ++ if( !reg.exactMatch( wmfile )) ++ continue; ++ QString wm = reg.cap( 1 ); ++ if( wms.values().contains( wm )) ++ continue; ++ wms[ name ] = wm; ++ dialog->windowManagerCombo->insertItem( name ); ++ if( wms[ name ] == current ) // make it selected ++ { ++ dialog->windowManagerCombo->setCurrentItem( dialog->windowManagerCombo->count() - 1 ); ++ oldwm = wm; ++ } ++ } ++} ++ ++QString SMServerConfig::currentWM() const ++{ ++ return wms[ dialog->windowManagerCombo->currentText() ]; ++} ++ + #include "kcmsmserver.moc" + +Index: kcontrol/smserver/kcmsmserver.h +=================================================================== +--- kcontrol/smserver/kcmsmserver.h.orig ++++ kcontrol/smserver/kcmsmserver.h +@@ -40,6 +40,10 @@ public: + + private: + SMServerConfigImpl* dialog; ++ void loadWMs( const QString& current ); ++ QString currentWM() const; ++ QMap< QString, QString > wms; // i18n text -> internal name ++ QString oldwm; // the original value + + }; + diff --git a/opensuse/core/tdebase/short-menus.diff b/opensuse/core/tdebase/short-menus.diff new file mode 100644 index 000000000..784c75ebb --- /dev/null +++ b/opensuse/core/tdebase/short-menus.diff @@ -0,0 +1,209 @@ +Index: kdesktop/Makefile.am +=================================================================== +--- kdesktop/Makefile.am.orig ++++ kdesktop/Makefile.am +@@ -6,6 +6,8 @@ kdesktop_la_LIBADD = libkdesktopsettin + + SUBDIRS = . lock pics patterns programs init kwebdesktop + ++KDE_OPTIONS = nofinal ++ + ####### Files + + bin_PROGRAMS = kcheckrunning +Index: kicker/kicker/ui/service_mnu.cpp +=================================================================== +--- kicker/kicker/ui/service_mnu.cpp.orig ++++ kicker/kicker/ui/service_mnu.cpp +@@ -111,6 +111,11 @@ void PanelServiceMenu::fillMenu(KService + QStringList suppressGenericNames = _root->suppressGenericNames(); + + KServiceGroup::List::ConstIterator it = _list.begin(); ++ KSortableValueList<KSharedPtr<KSycocaEntry>,QCString> slist; ++ KSortableValueList<KSharedPtr<KSycocaEntry>,QCString> glist; ++ QMap<QString,QString> specialTitle; ++ QMap<QString,QString> categoryIcon; ++ + bool separatorNeeded = false; + for (; it != _list.end(); ++it) + { +@@ -118,19 +123,108 @@ void PanelServiceMenu::fillMenu(KService + + if (e->isType(KST_KServiceGroup)) + { ++ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++ if ( KickerSettings::reduceMenuDepth() && g->SuSEshortMenu() ){ ++ KServiceGroup::List l = g->entries(true, excludeNoDisplay_ ); ++ if ( l.count() == 1 ) { ++ // the special case, we want to short the menu. ++ // TOFIX? : this works only for one level ++ KServiceGroup::List::ConstIterator _it=l.begin(); ++ KSycocaEntry *_e = *_it; ++ if (_e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(_e)); ++ QString key; ++ if ( g->SuSEgeneralDescription() ) { ++ // we use the application name ++ key = s->name(); ++ if( !s->genericName().isEmpty()) { ++ if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) ++ key = s->name() + " (" + s->genericName() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) ++ key = s->genericName() + " (" + s->name() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) ++ key = s->genericName(); ++ } ++ } ++ else { ++ // we use the normal menu description ++ key = s->name(); ++ if( !s->genericName().isEmpty()) { ++ if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) ++ key = s->name() + " (" + g->caption() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) ++ key = g->caption() + " (" + s->name() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) ++ key = g->caption(); ++ } ++ } ++ specialTitle.insert( _e->name(), key ); ++ categoryIcon.insert( _e->name(), g->icon() ); ++ slist.insert( key.local8Bit(), _e ); ++ // and escape from here ++ continue; ++ } ++ } ++ } ++ glist.insert( g->caption().local8Bit(), e ); ++ }else if( e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(e)); ++ QString name = s->name(); ++ if( !s->genericName().isEmpty()) { ++ if (KickerSettings::menuEntryFormat() == KickerSettings::NameAndDescription) ++ name = s->name() + " (" + s->genericName() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionAndName) ++ name = s->genericName() + " (" + s->name() + ")"; ++ else if (KickerSettings::menuEntryFormat() == KickerSettings::DescriptionOnly) ++ name = s->genericName(); ++ } ++ slist.insert( name.local8Bit(), e ); ++ } else ++ slist.insert( e->name().local8Bit(), e ); ++ } ++ ++ _list = _root->SuSEsortEntries( slist, glist, excludeNoDisplay_, true ); ++ it = _list.begin(); + ++ for (; it != _list.end(); ++it) { ++ ++ KSycocaEntry * e = *it; ++ ++ if (e->isType(KST_KServiceGroup)) { + KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); ++ if ( KickerSettings::reduceMenuDepth() && g->SuSEshortMenu() ){ ++ KServiceGroup::List l = g->entries(true, excludeNoDisplay_ ); ++ if ( l.count() == 1 ) { ++ /* // the special case, we want to short the menu. ++ // TOFIX? : this works only for one level ++ KServiceGroup::List::ConstIterator _it=l.begin(); ++ KSycocaEntry *_e = *_it; ++ if (_e->isType(KST_KService)) { ++ KService::Ptr s(static_cast<KService *>(_e)); ++ if ( g->SuSEgeneralDescription() ) ++ // we use the application name ++ insertMenuItem(s, id++, -1, 0, QString::null, QString::null, g->icon() ); ++ else ++ // we use the normal menu description ++ insertMenuItem(s, id++, -1, 0, QString::null, g->caption(), g->icon() ); ++ // and escape from here */ ++ continue; ++ // } ++ } ++ } ++ // standard sub menu ++ + QString groupCaption = g->caption(); +- ++ + // Avoid adding empty groups. + KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(g->relPath()); +- ++ + int nbChildCount = subMenuRoot->childCount(); + if (nbChildCount == 0 && !g->showEmptyMenu()) +- { ++ { + continue; +- } +- ++ } ++ + QString inlineHeaderName = g->showInlineHeader() ? groupCaption : ""; + // Item names may contain ampersands. To avoid them being converted + // to accelerators, replace them with two ampersands. +@@ -214,7 +308,7 @@ void PanelServiceMenu::fillMenu(KService + } + + KService::Ptr s(static_cast<KService *>(e)); +- insertMenuItem(s, id++, -1, &suppressGenericNames); ++ insertMenuItem(s, id++, -1, &suppressGenericNames, QString::null, specialTitle[s->name()], categoryIcon[s->name()] ); + } + else if (e->isType(KST_KServiceSeparator)) + { +@@ -296,7 +390,8 @@ void PanelServiceMenu::configChanged() + void PanelServiceMenu::insertMenuItem(KService::Ptr & s, int nId, + int nIndex/*= -1*/, + const QStringList *suppressGenericNames /* = 0 */, +- const QString & aliasname) ++ const QString & aliasname, const QString & label /*=QString::NULL*/, ++ const QString & categoryIcon /*=QString::null*/) + { + QString serviceName = (aliasname.isEmpty() ? s->name() : aliasname).simplifyWhiteSpace(); + QString comment = s->genericName().simplifyWhiteSpace(); +@@ -347,7 +442,15 @@ void PanelServiceMenu::insertMenuItem(KS + // to accelerators, replace them with two ampersands. + serviceName.replace("&", "&&"); + +- int newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex); ++ QString icon = s->icon(); ++ if (icon=="unknown") ++ icon = categoryIcon; ++ ++ int newId; ++ if ( label.isEmpty() ) ++ newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex); ++ else ++ newId = insertItem(KickerLib::menuIconSet(s->icon()), label, nId, nIndex); + entryMap_.insert(newId, static_cast<KSycocaEntry*>(s)); + } + +Index: kicker/kicker/ui/service_mnu.h +=================================================================== +--- kicker/kicker/ui/service_mnu.h.orig ++++ kicker/kicker/ui/service_mnu.h +@@ -83,7 +83,8 @@ protected slots: + protected: + void insertMenuItem(KService::Ptr & s, int nId, int nIndex = -1, + const QStringList *suppressGenericNames=0, +- const QString &aliasname = QString::null); ++ const QString &aliasname = QString::null, ++ const QString &label = QString::null, const QString &categoryIcon = QString::null); + virtual PanelServiceMenu * newSubMenu(const QString & label, + const QString & relPath, + QWidget * parent, const char * name, +Index: kicker/libkicker/kickerSettings.kcfg +=================================================================== +--- kicker/libkicker/kickerSettings.kcfg.orig ++++ kicker/libkicker/kickerSettings.kcfg +@@ -126,6 +126,11 @@ + <default>true</default> + </entry> + ++<entry name="ReduceMenuDepth" type="Bool" > ++ <label>Simplify menus with only a single item inside</label> ++ <default>false</default> ++ </entry> ++ + <entry name="MenuEntryHeight" type="Int" > + <label>Height of menu entries in pixels</label> + <default>0</default> diff --git a/opensuse/core/tdebase/show-konqueror-in-menu.diff b/opensuse/core/tdebase/show-konqueror-in-menu.diff new file mode 100644 index 000000000..a5f4b9ab3 --- /dev/null +++ b/opensuse/core/tdebase/show-konqueror-in-menu.diff @@ -0,0 +1,30 @@ +Index: konqueror/konqfilemgr.desktop +=================================================================== +--- konqueror/konqfilemgr.desktop.orig ++++ konqueror/konqfilemgr.desktop +@@ -4,7 +4,8 @@ Exec=kfmclient openProfile filemanagemen + Icon=kfm + DocPath=konqueror/index.html + +-Name=File Manager ++Name=Konqueror ++GenericName=File Manager + Name[af]=Lêer Bestuurder + Name[ar]=مدبّر الملÙات + Name[az]=Fayl Ä°darÉ™cisi +Index: konqueror/Makefile.am +=================================================================== +--- konqueror/Makefile.am.orig ++++ konqueror/Makefile.am +@@ -69,10 +69,7 @@ messages: rc.cpp + $(XGETTEXT) -kaliasLocal rc.cpp *.h *.cc *view/*h *view/*cc kedit*/*.h kedit*/*.cpp about/*.h about/*.cc remoteencodingplugin/*.cpp remoteencodingplugin/*.h shellcmdplugin/*.cpp -o `find sidebar -name "*.cpp"` `find sidebar -name "*.h"` -o $(podir)/konqueror.pot + + xdg_apps_DATA = kfmclient.desktop kfmclient_dir.desktop kfmclient_html.desktop \ +- kfmclient_war.desktop konqbrowser.desktop konquerorsu.desktop Home.desktop +- +-konq_data4_DATA = konqfilemgr.desktop +-konq_data4dir = $(kde_appsdir)/.hidden ++ kfmclient_war.desktop konqbrowser.desktop konquerorsu.desktop Home.desktop konqfilemgr.desktop + + kde_kcfg_DATA = konqueror.kcfg + diff --git a/opensuse/core/tdebase/simplify-randr-settings.diff b/opensuse/core/tdebase/simplify-randr-settings.diff new file mode 100644 index 000000000..93add22fd --- /dev/null +++ b/opensuse/core/tdebase/simplify-randr-settings.diff @@ -0,0 +1,91 @@ +--- kcontrol/randr/krandrmodule.cpp ++++ kcontrol/randr/krandrmodule.cpp +@@ -114,23 +114,15 @@ KRandRModule::KRandRModule(QWidget *parent, const char *name, const QStringList& + m_rotationGroup->setRadioButtonExclusive(true); + QWhatsThis::add(m_rotationGroup, i18n("The options in this section allow you to change the rotation of your screen.")); + +- m_applyOnStartup = new QCheckBox(i18n("Apply settings on KDE startup"), this); +- topLayout->addWidget(m_applyOnStartup); +- QWhatsThis::add(m_applyOnStartup, i18n("If this option is enabled the size and orientation settings will be used when KDE starts.")); +- connect(m_applyOnStartup, SIGNAL(clicked()), SLOT(setChanged())); +- +- QHBox* syncBox = new QHBox(this); +- syncBox->layout()->addItem(new QSpacerItem(20, 1, QSizePolicy::Maximum)); +- m_syncTrayApp = new QCheckBox(i18n("Allow tray application to change startup settings"), syncBox); +- topLayout->addWidget(syncBox); +- QWhatsThis::add(m_syncTrayApp, i18n("If this option is enabled, options set by the system tray applet will be saved and loaded when KDE starts instead of being temporary.")); +- connect(m_syncTrayApp, SIGNAL(clicked()), SLOT(setChanged())); ++ m_applyOnlySession = new QCheckBox(i18n("Change settings only for current session"), this); ++ topLayout->addWidget(m_applyOnlySession); ++ QWhatsThis::add(m_applyOnlySession, i18n("If this option is enabled the size and orientation settings will be only changed for the current session.")); ++ connect(m_applyOnlySession, SIGNAL(clicked()), SLOT(setChanged())); + + topLayout->addStretch(1); + + // just set the "apply settings on startup" box + load(); +- m_syncTrayApp->setEnabled(m_applyOnStartup->isChecked()); + + slotScreenChanged(QApplication::desktop()->primaryScreen()); + +@@ -272,8 +264,7 @@ void KRandRModule::load( bool useDefaults ) + m_oldApply = loadDisplay(config, false); + m_oldSyncTrayApp = syncTrayApp(config); + +- m_applyOnStartup->setChecked(m_oldApply); +- m_syncTrayApp->setChecked(m_oldSyncTrayApp); ++ m_applyOnlySession->setChecked(!m_oldApply); + + emit changed( useDefaults ); + } +@@ -291,8 +282,7 @@ void KRandRModule::save() + + apply(); + +- m_oldApply = m_applyOnStartup->isChecked(); +- m_oldSyncTrayApp = m_syncTrayApp->isChecked(); ++ m_oldApply = !m_applyOnlySession->isChecked(); + KConfig config("kcmrandrrc"); + saveDisplay(config, m_oldApply, m_oldSyncTrayApp); + +@@ -308,8 +298,7 @@ void KRandRModule::setChanged() + #endif + + +- bool isChanged = (m_oldApply != m_applyOnStartup->isChecked()) || (m_oldSyncTrayApp != m_syncTrayApp->isChecked()); +- m_syncTrayApp->setEnabled(m_applyOnStartup->isChecked()); ++ bool isChanged = (m_oldApply != !m_applyOnlySession->isChecked()); + + if (!isChanged) + for (int screenIndex = 0; screenIndex < numScreens(); screenIndex++) { +--- kcontrol/randr/krandrmodule.h ++++ kcontrol/randr/krandrmodule.h +@@ -79,8 +79,7 @@ protected: + KComboBox* m_sizeCombo; + QButtonGroup* m_rotationGroup; + KComboBox* m_refreshRates; +- QCheckBox* m_applyOnStartup; +- QCheckBox* m_syncTrayApp; ++ QCheckBox* m_applyOnlySession; + bool m_oldApply; + bool m_oldSyncTrayApp; + +--- kcontrol/randr/randrdisplay.cpp ++++ kcontrol/randr/randrdisplay.cpp +@@ -241,7 +241,7 @@ bool RandRDisplay::loadDisplay(KConfig& config, bool loadScreens) + bool RandRDisplay::applyOnStartup(KConfig& config) + { + config.setGroup("Display"); +- return config.readBoolEntry("ApplyOnStartup", false); ++ return config.readBoolEntry("ApplyOnStartup", true); + } + + bool RandRDisplay::syncTrayApp(KConfig& config) +@@ -254,7 +254,6 @@ void RandRDisplay::saveDisplay(KConfig& config, bool applyOnStartup, bool syncTr + { + config.setGroup("Display"); + config.writeEntry("ApplyOnStartup", applyOnStartup); +- config.writeEntry("SyncTrayApp", syncTrayApp); + + #ifdef HAS_RANDR_1_2 + if (RandR::has_1_2) diff --git a/opensuse/core/tdebase/sourceforge.desktop b/opensuse/core/tdebase/sourceforge.desktop new file mode 100644 index 000000000..4a218ad84 --- /dev/null +++ b/opensuse/core/tdebase/sourceforge.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Service +Name=SourceForge Tracker +ServiceTypes=SearchProvider +Keys=sft +Query=https://sourceforge.net/support/tracker.php?aid=\{@} diff --git a/opensuse/core/tdebase/spellcheck-default-utf8.diff b/opensuse/core/tdebase/spellcheck-default-utf8.diff new file mode 100644 index 000000000..57d49fab6 --- /dev/null +++ b/opensuse/core/tdebase/spellcheck-default-utf8.diff @@ -0,0 +1,13 @@ +Index: kcontrol/spellchecking/spellchecking.cpp +=================================================================== +--- kcontrol/spellchecking/spellchecking.cpp.orig ++++ kcontrol/spellchecking/spellchecking.cpp +@@ -67,7 +67,7 @@ void KSpellCheckingConfig::defaults() + spellConfig->setRunTogether(0); + spellConfig->setDictionary(""); + spellConfig->setDictFromList(FALSE); +- spellConfig->setEncoding (KS_E_ASCII); ++ spellConfig->setEncoding (KS_E_UTF8); + spellConfig->setClient (KS_CLIENT_ISPELL); + } + diff --git a/opensuse/core/tdebase/startkde.diff b/opensuse/core/tdebase/startkde.diff new file mode 100644 index 000000000..c7cd061ce --- /dev/null +++ b/opensuse/core/tdebase/startkde.diff @@ -0,0 +1,80 @@ +Index: startkde +=================================================================== +--- startkde.orig ++++ startkde +@@ -3,6 +3,9 @@ + # DEFAULT KDE STARTUP SCRIPT ( KDE-3.5.10 ) + # + ++PATH=/opt/kde3/bin:${PATH/:\/opt\/kde3\/bin} ++export PATH ++test -x /usr/bin/xrandr && /usr/bin/xrandr --auto + # When the X server dies we get a HUP signal from xinit. We must ignore it + # because we still need to do some cleanup. + trap 'echo GOT SIGHUP' HUP +@@ -19,7 +22,7 @@ fi + # people's heads. We use colours from the standard KDE palette for those with + # palettised displays. + if test -z "$XDM_MANAGED" || echo "$XDM_MANAGED" | grep ",auto" > /dev/null; then +- xsetroot -solid "#000000" ++ : # xsetroot -solid "#C0C0C0" + fi + + # we have to unset this for Darwin since it will screw up KDE's dynamic-loading +@@ -62,7 +65,7 @@ cat >$kdehome/share/config/startupconfig + kcminputrc Mouse cursorTheme '' + kcminputrc Mouse cursorSize '' + kpersonalizerrc General FirstLogin true +-ksplashrc KSplash Theme Default ++ksplashrc KSplash Theme ksplashx-suse + kcmrandrrc Display ApplyOnStartup false + kcmrandrrc [Screen0] + kcmrandrrc [Screen1] +@@ -160,6 +163,16 @@ Xft.dpi: 96 + EOF + fi + ++case "$ksplashrc_ksplash_theme" in ++ ksplashx-*) ++ if test -x /opt/kde3/bin/ksplashx; then ++ /opt/kde3/bin/ksplashx ${ksplashrc_ksplash_theme#ksplashx-} ++ else ++ ksplashrc_ksplash_theme=Default ++ fi ++ ;; ++esac ++ + # Source scripts found in <localprefix>/env/*.sh and <prefixes>/env/*.sh + # (where <localprefix> is $KDEHOME or ~/.kde, and <prefixes> is where KDE is installed) + # +@@ -286,7 +299,7 @@ dcopserver_shutdown + echo 'startkde: Starting up...' 1>&2 + + # run KPersonalizer before the session, if this is the first login +-if test "$kpersonalizerrc_general_firstlogin" = "true"; then ++if false && test "$kpersonalizerrc_general_firstlogin" = "true"; then + # start only dcopserver, don't start whole kdeinit (takes too long) + echo 'startkde: Running kpersonalizer...' 1>&2 + dcopserver +@@ -305,6 +318,8 @@ if test -z "$dl"; then + case "$ksplashrc_ksplash_theme" in + None) + ;; # nothing ++ ksplashx-*) ++ ;; # started earlier + Simple) + if test "$kpersonalizerrc_general_firstlogin" = "true"; then + ksplashsimple +@@ -384,9 +399,11 @@ done + echo 'startkde: Shutting down...' 1>&2 + + # Clean up ++if test -e /opt/kde3/bin/artsshell; then ++ artsshell -q terminate ++fi + kdeinit_shutdown + dcopserver_shutdown --wait +-artsshell -q terminate + # KDE4 support + kde4 kdeinit4_shutdown 2>/dev/null + diff --git a/opensuse/core/tdebase/startkde.suse.sh b/opensuse/core/tdebase/startkde.suse.sh new file mode 100644 index 000000000..28c200695 --- /dev/null +++ b/opensuse/core/tdebase/startkde.suse.sh @@ -0,0 +1,140 @@ + +# +# do we run in a prelinked system ? +# +if test -f /etc/sysconfig/prelink; then +. /etc/sysconfig/prelink + if test "$USE_PRELINK" = "yes" ; then + KDE_IS_PRELINKED=1 + export KDE_IS_PRELINKED + else + unset KDE_IS_PRELINKED + fi +fi + +# +# Do we have a special Gtk theming for our Qt widget theme ? +# +if [ ! -e $HOME/.no-qtrc-to-gtkrc-mapping ]; then + + SUSE_VERSION="`cat /etc/SuSE-release | sed -n 's/VERSION = //p'`" + + # Defaults for SuSE 9.0 + GTK2_SYSCONFDIR=/etc/opt/gnome + GTK2_DATADIR=/opt/gnome/share/themes/ + + # use general gtk-qt-engine + if [ -e "$GTK2_DATADIR/Qt/gtk-2.0/gtkrc" ] ; then + GTK2_THEME_RC="$GTK2_DATADIR/Qt/gtk-2.0/gtkrc" + fi + + # GTK2 + # NOTE: ~/.gtkrc-2.0-kde is added later (in latest KDE only) + if [ "$GTK2_RC_FILES" ]; then + export GTK2_RC_FILES="$GTK2_RC_FILES:$GTK2_THEME_RC:$HOME/.gtkrc-2.0-qtengine:$HOME/.gtkrc-2.0" + else + export GTK2_RC_FILES="$GTK2_SYSCONFDIR/gtk-2.0/gtkrc:$GTK2_THEME_RC:$HOME/.gtkrc-2.0-qtengine:$HOME/.gtkrc-2.0" + fi + +fi + +# +# use optimized libs, if your CPU has the needed support +# (kdemultimedia package has some SSE optimized libs) +[ -z "$LD_HWCAP_MASK" ] && export LD_HWCAP_MASK=0x20000000 + +if [ -r /etc/sysconfig/windowmanager ]; then + # Do the user want the SuSE theme ? + source /etc/sysconfig/windowmanager + + # Should we really enable FAM support for KDE ? + export USE_FAM="$KDE_USE_FAM" + + # Disable IPv6 ? + if [ "$KDE_USE_IPV6" = "no" ]; then + export KDE_NO_IPV6=1 + fi + # Disable IDN ? + if [ "$KDE_USE_IDN" = "no" ]; then + export KDE_NO_IDN=1 + fi + +else + if [ -r /etc/rc.config ]; then + # Do the user want the SuSE theme ? + INSTALL_DESKTOP_EXTENSIONS=`bash -c "source /etc/rc.config && echo \\$INSTALL_DESKTOP_EXTENSIONS"` + + # Should we really enable FAM support for KDE ? + USE_FAM=`bash -c "source /etc/rc.config && echo \\$KDE_USE_FAM"` + export USE_FAM + fi +fi + +# +# create SuSE defaults +# +if [ "$INSTALL_DESKTOP_EXTENSIONS" == "yes" ]; then + if [ -x /opt/kde3/bin/kde-open ]; then + export DESKTOP_LAUNCH=kde-open + fi + if [ "$USER" == "root" ]; then + if [ ! -e "$HOME/.skel/kdebase3" -a ! -e "$KDEHOME/share/config/kdeglobals" ]; then + if [ -e "/opt/kde3/bin/startkde.theme.unitedlinux" ]; then + . /opt/kde3/bin/startkde.theme.unitedlinux + copy_default_root_ul "$KDEHOME" + create_default_desktop_ul "$HOME/Desktop/" + fi + + if [ -e "/opt/kde3/bin/startkde.theme" ]; then + . /opt/kde3/bin/startkde.theme + fi + copy_default_root "$KDEHOME" + create_default_desktop "$HOME/Desktop/" + mkdir -p $HOME/.skel/ + touch $HOME/.skel/kdebase3 $HOME/.skel/kdebase3.91 + fi + else + if [ ! -e "$HOME/.skel/kdebase3" -a ! -e "$KDEHOME/share/config/kdeglobals" ]; then + if [ -e "/opt/kde3/bin/startkde.theme.unitedlinux" ]; then + . /opt/kde3/bin/startkde.theme.unitedlinux + copy_default_user_ul "$KDEHOME" + create_default_desktop_ul "$HOME/Desktop/" + fi + + if [ -e "/opt/kde3/bin/startkde.theme" ]; then + . /opt/kde3/bin/startkde.theme + fi + copy_default_user "$KDEHOME" + create_default_desktop "$HOME/Desktop/" + mkdir -p $HOME/.skel/ + touch $HOME/.skel/kdebase3 $HOME/.skel/kdebase3.91 + fi + fi + if [ -e /opt/kde3/bin/startkde.update93 -a ! -e "$HOME/.skel/kdebase3.93" ]; then + . /opt/kde3/bin/startkde.update93 + mkdir -p $HOME/.skel/ + touch $HOME/.skel/kdebase3.93 + fi + for i in /opt/kde3/share/UnitedLinux/addon-scripts/*; do + [ -r "$i" ] && \ + . "$i" + done +fi + +# check if any rpms have been (un)installed since ksycoca +# had been built, if yes, trigger ksycoca rebuild immediatelly +# instead of delayed + +kdehome=$HOME/.kde +test -n "$KDEHOME" && kdehome=`echo "$KDEHOME"|sed "s,^~/,$HOME/,"` +host=$HOSTNAME +test -n "$XAUTHLOCALHOSTNAME" && host=$XAUTHLOCALHOSTNAME +ksycoca="$kdehome/cache-$host/ksycoca" + +if test -f "$ksycoca"; then + if test -f /var/lib/rpm/Packages; then + if test /var/lib/rpm/Packages -nt "$ksycoca"; then + rm -f "$ksycoca" + fi + fi +fi diff --git a/opensuse/core/tdebase/stopkde.suse.sh b/opensuse/core/tdebase/stopkde.suse.sh new file mode 100644 index 000000000..54f7de3a3 --- /dev/null +++ b/opensuse/core/tdebase/stopkde.suse.sh @@ -0,0 +1,13 @@ +#! /bin/sh + +if test -n "$SSH_AGENT_PID"; then + ssh-agent -k +fi + +if test -n "$GPG_AGENT_INFO"; then + pid=`echo "$GPG_AGENT_INFO" | cut -d: -f2` + if test -n "$pid"; then + kill $pid + fi +fi + diff --git a/opensuse/core/tdebase/suse_default_move.diff b/opensuse/core/tdebase/suse_default_move.diff new file mode 100644 index 000000000..1eb938e20 --- /dev/null +++ b/opensuse/core/tdebase/suse_default_move.diff @@ -0,0 +1,83 @@ +Index: empty/Makefile.am +=================================================================== +--- /dev/null ++++ empty/Makefile.am +@@ -0,0 +1,17 @@ ++# set the include path for X, qt and KDE ++INCLUDES= $(all_includes) ++ ++# you can add here more. This one gets installed ++bin_PROGRAMS = default_desktop_aligning ++ ++# Which sources should be compiled ++default_desktop_aligning_SOURCES = moving.cpp KDesktopIface.stub ++ ++# the library search path. ++default_desktop_aligning_LDFLAGS = $(all_libraries) $(KDE_RPATH) ++ ++# the libraries to link against. Be aware of the order. First the libraries, ++# that depend on the following ones. ++default_desktop_aligning_LDADD = $(LIB_KDEUI) ++ ++KDesktopIface_DIR = $(srcdir)/../kdesktop +Index: empty/moving.cpp +=================================================================== +--- /dev/null ++++ empty/moving.cpp +@@ -0,0 +1,56 @@ ++#include <kstandarddirs.h> ++#include <kglobalsettings.h> ++#include <kapplication.h> ++#include "KDesktopIface_stub.h" ++#include <kdebugclasses.h> ++#include <kcmdlineargs.h> ++#include <kconfig.h> ++#include <unistd.h> ++#include <stdlib.h> ++#include <qfileinfo.h> ++ ++int main(int argc, char **argv) ++{ ++ KCmdLineArgs::init(argc, argv, "default_desktop_moving", ++ "move the icons on the correct place on initial boot", ++ "0.1"); ++ KApplication app; ++ QStringList icons = KGlobal::dirs()->findAllResources("data", "default_desktop/*.desktop"); ++ char buffer[PATH_MAX]; ++ strcpy(buffer, "/tmp/suse_desktop_XXXXXX"); ++ mkdtemp(buffer); ++ QString tname = QString::fromLatin1(buffer); ++ ++ icons.sort(); ++ ++ KDesktopIface_stub stub("kdesktop", "KDesktopIface"); ++ KConfig c( "kdesktoprc" ); ++ c.setGroup( "General" ); ++ ++ if ( c.readBoolEntry( "CopyDesktopLinks", true ) ) ++ for (QStringList::ConstIterator it = icons.begin(); it != icons.end(); ++it) ++ { ++ QString name = *it; ++ QPoint t; ++ bool col = (name.mid(name.findRev('/') + 1, 4) == "COL_"); ++ name = name.mid(name.findRev('/') + 5, name.length()); ++ int index = name.find('_'); ++ int num = name.left(index).toInt(); ++ ++ if (col) ++ t = stub.findPlaceForIcon(num, -1); ++ else ++ t = stub.findPlaceForIcon(-1, num); ++ QFileInfo f(*it); ++ ++ name = name.mid(name.find('_', index + 1) + 1, name.length()); ++ ++ if ( 0 == system(QString("mv '%1' '%1'").arg(*it).arg(tname + "/" + name).local8Bit()) ) ++ stub.addIcon( tname + "/" + name, t.x(), t.y()); ++ ++ sleep(2); // only need to make sure kdesktop goes back in event loop ++ } ++ stub.lineupIcons(); ++ system(QString("rm -f %1/moving_desktop.desktop").arg(KGlobalSettings::autostartPath()).latin1()); ++ system(QString("rm -rf '%1'").arg(tname).local8Bit()); ++} diff --git a/opensuse/core/tdebase/suspend-kpowersave.diff b/opensuse/core/tdebase/suspend-kpowersave.diff new file mode 100644 index 000000000..13aaa131c --- /dev/null +++ b/opensuse/core/tdebase/suspend-kpowersave.diff @@ -0,0 +1,178 @@ +Subject: Use KPowersave for suspend if available +From: Lubos Lunak +Bug: bnc#326848 +Patch-upstream: No + +--- kicker/kicker/ui/k_new_mnu.cpp.sav 2008-11-20 10:12:42.000000000 +0100 ++++ kicker/kicker/ui/k_new_mnu.cpp 2008-11-20 13:49:20.000000000 +0100 +@@ -3691,6 +3691,9 @@ int KMenu::max_items(int category) const + + #ifdef KDELIBS_SUSE + #include <liblazy.h> ++ ++#include <X11/Xlib.h> ++#include <fixx11h.h> + #endif + + void KMenu::insertSuspendOption( int &nId, int &index ) +@@ -3699,6 +3702,14 @@ void KMenu::insertSuspendOption( int &nI + int supported = -1; + bool suspend_ram, suspend_disk, standby; + ++ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" ); ++ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" ); ++ if( reply.isValid()) { ++ QStringList supported = reply; ++ suspend_ram = supported.contains( "suspendToRAM" ); ++ suspend_disk = supported.contains( "suspendToDisk" ); ++ standby = supported.contains( "standBy" ); ++ } else { + liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); + if (supported == 1) + suspend_ram = true; +@@ -3721,6 +3732,7 @@ void KMenu::insertSuspendOption( int &nI + suspend_ram = false; + if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1) + standby = false; ++ } + + if ( ! ( standby + suspend_ram + suspend_disk ) ) + return; +@@ -3745,6 +3757,25 @@ void KMenu::slotSuspend(int id) + { + #ifdef KDELIBS_SUSE + int error = 0; ++ ++ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" ); ++ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" ); ++ if( reply.isValid()) { ++ bool ok; ++ extern Time qt_x_time; ++ XUngrabKeyboard( qt_xdisplay(), qt_x_time ); ++ XUngrabPointer( qt_xdisplay(), qt_x_time ); ++ XSync( qt_xdisplay(), False ); ++ if( id == 1 ) ++ ok = kpowersave.call( "do_suspendToDisk" ); ++ else if( id == 2 ) ++ ok = kpowersave.call( "do_suspendToRAM" ); ++ else if( id == 3 ) ++ ok = kpowersave.call( "do_standBy" ); ++ else ++ return; ++ error = ok ? 0 : 1; ++ } else { + int wake = 0; + DBusMessage *reply = 0; + +@@ -3773,6 +3804,8 @@ void KMenu::slotSuspend(int id) + DBUS_TYPE_INVALID); + else + return; ++ } ++ + if (error) + #endif + KMessageBox::error(this, i18n("Suspend failed")); +--- ksmserver/shutdowndlg.cpp.sav 2008-11-20 10:12:41.000000000 +0100 ++++ ksmserver/shutdowndlg.cpp 2008-11-20 13:34:19.000000000 +0100 +@@ -40,6 +40,7 @@ Copyright (C) 2000 Matthias Ettrich <ett + #include <kdialog.h> + #include <kseparator.h> + #include <kmessagebox.h> ++#include <dcopref.h> + + #include <sys/types.h> + #include <sys/utsname.h> +@@ -264,6 +265,14 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + } else + QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p></qt>" ) ); + ++ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" ); ++ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" ); ++ if( reply.isValid()) { ++ QStringList supported = reply; ++ suspend_ram = supported.contains( "suspendToRAM" ); ++ suspend_disk = supported.contains( "suspendToDisk" ); ++ standby = supported.contains( "standBy" ); ++ } else { + int supported = -1; + liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); + if (supported == 1) +@@ -287,6 +296,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + suspend_ram = false; + if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1) + standby = false; ++ } + + int sum = standby + suspend_ram + suspend_disk; + if ( sum ) { +@@ -325,6 +335,24 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget* + void KSMShutdownDlg::slotSuspend() + { + int error = 0; ++ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" ); ++ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" ); ++ if( reply.isValid()) { ++ bool ok; ++ // so that screen locking can take place ++ extern Time qt_x_time; ++ XUngrabKeyboard( qt_xdisplay(), qt_x_time ); ++ XUngrabPointer( qt_xdisplay(), qt_x_time ); ++ XSync( qt_xdisplay(), False ); ++ if( suspend_disk ) ++ ok = kpowersave.call( "do_suspendToDisk" ); ++ else if( suspend_ram ) ++ ok = kpowersave.call( "do_suspendToRAM" ); ++ else ++ ok = kpowersave.call( "do_standBy" ); ++ error = ok ? 0 : 1; ++ } else { ++ + int wake = 0; + DBusMessage *reply; + +@@ -351,6 +379,7 @@ void KSMShutdownDlg::slotSuspend() + "Standby", + &reply, + DBUS_TYPE_INVALID); ++ } + + if (error) + KMessageBox::error(this, i18n("Suspend failed")); +@@ -362,6 +391,27 @@ void KSMShutdownDlg::slotSuspend() + void KSMShutdownDlg::slotSuspend(int id) + { + int error = 0; ++ ++ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" ); ++ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" ); ++ if( reply.isValid()) { ++ bool ok; ++ extern Time qt_x_time; ++ XUngrabKeyboard( qt_xdisplay(), qt_x_time ); ++ XUngrabPointer( qt_xdisplay(), qt_x_time ); ++ XSync( qt_xdisplay(), False ); ++ if( suspend_disk && id == 1 ) ++ ok = kpowersave.call( "do_suspendToDisk" ); ++ else if( suspend_ram && id == 2 ) ++ ok = kpowersave.call( "do_suspendToRAM" ); ++ else if( standby && id == 3 ) ++ ok = kpowersave.call( "do_standBy" ); ++ else ++ return; ++ error = ok ? 0 : 1; ++ } else { ++ ++ + int wake = 0; + DBusMessage *reply; + +@@ -390,6 +440,8 @@ void KSMShutdownDlg::slotSuspend(int id) + DBUS_TYPE_INVALID); + else + return; ++ } ++ + if (error) + KMessageBox::error(this, i18n("Suspend failed")); + diff --git a/opensuse/core/tdebase/suspend-unmount.diff b/opensuse/core/tdebase/suspend-unmount.diff new file mode 100644 index 000000000..dabdd1271 --- /dev/null +++ b/opensuse/core/tdebase/suspend-unmount.diff @@ -0,0 +1,179 @@ +Index: kioslave/media/libmediacommon/medium.cpp +=================================================================== +--- kioslave/media/libmediacommon/medium.cpp.orig ++++ kioslave/media/libmediacommon/medium.cpp +@@ -42,6 +42,7 @@ Medium::Medium(const QString &id, const + loadUserLabel(); + + m_halmounted = false; ++ m_isHotplug = false; + } + + Medium::Medium() +@@ -59,8 +60,9 @@ Medium::Medium() + m_properties+= QString::null; /* BASE_URL */ + m_properties+= QString::null; /* MIME_TYPE */ + m_properties+= QString::null; /* ICON_NAME */ +- ++ + m_halmounted = false; ++ m_isHotplug = false; + } + + const Medium Medium::create(const QStringList &properties) +Index: kioslave/media/libmediacommon/medium.h +=================================================================== +--- kioslave/media/libmediacommon/medium.h.orig ++++ kioslave/media/libmediacommon/medium.h +@@ -82,18 +82,22 @@ public: + void setHalMounted(bool flag) const { m_halmounted = flag; } + bool halMounted() const { return m_halmounted; } + ++ void setIsHotplug( bool state ) { m_isHotplug = state; } ++ bool isHotplug() const { return m_isHotplug; } ++ + private: + Medium(); + void loadUserLabel(); + + QStringList m_properties; + mutable bool m_halmounted; +- ++ bool m_isHotplug; ++ + friend class QValueListNode<const Medium>; + }; + + namespace MediaManagerUtils { +- static inline QMap<QString,QString> splitOptions(const QStringList & options) ++ static inline QMap<QString,QString> splitOptions(const QStringList & options) + { + QMap<QString,QString> valids; + +Index: kioslave/media/mediamanager/mediamanager.cpp +=================================================================== +--- kioslave/media/mediamanager/mediamanager.cpp.orig ++++ kioslave/media/mediamanager/mediamanager.cpp +@@ -330,6 +330,54 @@ void MediaManager::slotMediumChanged(con + emit mediumChanged(name); + } + ++QString MediaManager::unmountAllSuspend() ++{ ++ QPtrList<Medium> list = m_mediaList.list(); ++ ++ QPtrList<Medium>::const_iterator it = list.begin(); ++ QPtrList<Medium>::const_iterator end = list.end(); ++ ++ QString result; ++ ++ for (; it!=end; ++it) ++ { ++ if ( (*it)->isMounted() && (*it)->isHotplug() ) ++ { ++ QString tmp = unmount( (*it)->id() ); ++ if ( !tmp.isEmpty() ) // umount failed ++ result = tmp; ++ else ++ m_suspendResumeMountList.append( (*it)->id() ); ++ } ++ } ++ ++ // return last error ++ return result; ++} ++ ++QString MediaManager::remountAllResume() ++{ ++ QString result; ++ ++ for (QStringList::const_iterator it = m_suspendResumeMountList.begin(); ++ it != m_suspendResumeMountList.end(); ++ ++it) ++ { ++ const Medium *m = m_mediaList.findById(*it); ++ ++ if ( m && m->needMounting() ) ++ { ++ QString tmp = mount( *it ); ++ if ( !tmp.isEmpty() ) // mount failed ++ result = tmp; ++ } ++ } ++ ++ m_suspendResumeMountList.clear(); ++ ++ // return last error ++ return result; ++} + + extern "C" { + KDE_EXPORT KDEDModule *create_mediamanager(const QCString &obj) +Index: kioslave/media/mediamanager/mediamanager.h +=================================================================== +--- kioslave/media/mediamanager/mediamanager.h.orig ++++ kioslave/media/mediamanager/mediamanager.h +@@ -58,6 +58,20 @@ k_dcop: + bool removableUnplug(const QString &devNode); + bool removableCamera(const QString &devNode); + ++ /** ++ * Unmount manually all partitions when going to suspend ++ * ++ * @return last error if any ++ */ ++ QString unmountAllSuspend(); ++ ++ /** ++ * Remount previously unmounted partitions in unmountAllSuspend() ++ * ++ * @return last error if any ++ */ ++ QString remountAllResume(); ++ + k_dcop_signals: + void mediumAdded(const QString &name, bool allowNotification); + void mediumRemoved(const QString &name, bool allowNotification); +@@ -70,7 +84,7 @@ k_dcop_signals: + + private slots: + void loadBackends(); +- ++ + void slotMediumAdded(const QString &id, const QString &name, + bool allowNotification); + void slotMediumRemoved(const QString &id, const QString &name, +@@ -85,6 +99,7 @@ private: + HALBackend *m_halbackend; + MediaDirNotify m_dirNotify; + FstabBackend *m_fstabbackend; ++ QStringList m_suspendResumeMountList; + }; + + #endif +Index: kioslave/media/mediamanager/halbackend.cpp +=================================================================== +--- kioslave/media/mediamanager/halbackend.cpp.orig ++++ kioslave/media/mediamanager/halbackend.cpp +@@ -459,6 +459,8 @@ void HALBackend::setVolumeProperties(Med + libhal_volume_get_fstype(halVolume), /* Filesystem type */ + libhal_volume_is_mounted(halVolume) ); /* Mounted ? */ + ++ medium->setIsHotplug( libhal_drive_is_hotpluggable(halDrive) ); ++ + char* name = libhal_volume_policy_compute_display_name(halDrive, halVolume, m_halStoragePolicy); + QString volume_name = QString::fromUtf8(name); + QString media_name = volume_name; +Index: kioslave/media/mediamanager/halbackend.h +=================================================================== +--- kioslave/media/mediamanager/halbackend.h.orig ++++ kioslave/media/mediamanager/halbackend.h +@@ -86,6 +86,8 @@ public: + QString mount(const Medium *medium); + QString unmount(const QString &id); + ++ static bool isHotplug( const QString & id ); ++ + private: + /** + * Append a device in the media list. This function will check if the device diff --git a/opensuse/core/tdebase/system-folder_man.diff b/opensuse/core/tdebase/system-folder_man.diff new file mode 100644 index 000000000..98fd9e08f --- /dev/null +++ b/opensuse/core/tdebase/system-folder_man.diff @@ -0,0 +1,13 @@ +Index: kioslave/system/entries/documents.desktop +=================================================================== +--- kioslave/system/entries/documents.desktop.orig ++++ kioslave/system/entries/documents.desktop +@@ -1,7 +1,7 @@ + [Desktop Entry] + Type=Link + Path[$e]=$( kio_system_documenthelper ) +-Icon=folder_important ++Icon=folder_man + Name=Documents Folder + Name[af]=Dokument Gids + Name[ar]=مستنداتي diff --git a/opensuse/core/tdebase/systray_order.diff b/opensuse/core/tdebase/systray_order.diff new file mode 100644 index 000000000..b864afc8e --- /dev/null +++ b/opensuse/core/tdebase/systray_order.diff @@ -0,0 +1,162 @@ +Index: kicker/applets/systemtray/systemtrayapplet.cpp +=================================================================== +--- kicker/applets/systemtray/systemtrayapplet.cpp.orig ++++ kicker/applets/systemtray/systemtrayapplet.cpp +@@ -187,6 +187,7 @@ bool SystemTrayApplet::x11Event( XEvent + if( isWinManaged( (WId)e->xclient.data.l[2] ) ) // we already manage it + return true; + embedWindow( e->xclient.data.l[2], false ); ++ updateVisibleWins(); + layoutTray(); + return true; + } +@@ -213,13 +214,12 @@ void SystemTrayApplet::preferences() + connect(m_settingsDialog, SIGNAL(finished()), this, SLOT(settingsDialogFinished())); + + m_iconSelector = new KActionSelector(m_settingsDialog); +- m_iconSelector->setAvailableLabel(i18n("Visible icons:")); +- m_iconSelector->setSelectedLabel(i18n("Hidden icons:")); +- m_iconSelector->setShowUpDownButtons(false); ++ m_iconSelector->setAvailableLabel(i18n("Hidden icons:")); ++ m_iconSelector->setSelectedLabel(i18n("Visible icons:")); + m_settingsDialog->setMainWidget(m_iconSelector); + +- QListBox *shownListBox = m_iconSelector->availableListBox(); +- QListBox *hiddenListBox = m_iconSelector->selectedListBox(); ++ QListBox *hiddenListBox = m_iconSelector->availableListBox(); ++ QListBox *shownListBox = m_iconSelector->selectedListBox(); + + TrayEmbedList::const_iterator it = m_shownWins.begin(); + TrayEmbedList::const_iterator itEnd = m_shownWins.end(); +@@ -261,26 +261,48 @@ void SystemTrayApplet::applySettings() + } + + KConfig *conf = config(); +- conf->setGroup("HiddenTrayIcons"); +- QString name; + +- // use the following snippet of code someday to implement ordering +- // of icons +- /* +- m_visibleIconList.clear(); +- QListBoxItem* item = m_iconSelector->availableListBox()->firstItem(); +- for (; item; item = item->next()) ++ // Save the sort order and hidden status using the window class (WM_CLASS) rather ++ // than window name (caption) - window name is i18n-ed, so it's for example ++ // not possible to create default settings. ++ // For backwards compatibility, name is kept as it is, class is preceded by '!'. ++ QMap< QString, QString > windowNameToClass; ++ for( TrayEmbedList::ConstIterator it = m_shownWins.begin(); ++ it != m_shownWins.end(); ++ ++it ) { ++ KWin::WindowInfo info = KWin::windowInfo( (*it)->embeddedWinId(), NET::WMName, NET::WM2WindowClass); ++ windowNameToClass[ info.name() ] = '!' + info.windowClassClass(); ++ } ++ for( TrayEmbedList::ConstIterator it = m_hiddenWins.begin(); ++ it != m_hiddenWins.end(); ++ ++it ) { ++ KWin::WindowInfo info = KWin::windowInfo( (*it)->embeddedWinId(), NET::WMName, NET::WM2WindowClass); ++ windowNameToClass[ info.name() ] = '!' + info.windowClassClass(); ++ } ++ ++ conf->setGroup("SortedTrayIcons"); ++ m_sortOrderIconList.clear(); ++ for(QListBoxItem* item = m_iconSelector->selectedListBox()->firstItem(); ++ item; ++ item = item->next()) + { +- m_visibleIconList.append(item->text()); ++ if( windowNameToClass.contains(item->text())) ++ m_sortOrderIconList.append(windowNameToClass[item->text()]); ++ else ++ m_sortOrderIconList.append(item->text()); + } +- conf->writeEntry("Visible", m_visibleIconList); +- selection.clear();*/ ++ conf->writeEntry("SortOrder", m_sortOrderIconList); + ++ conf->setGroup("HiddenTrayIcons"); + m_hiddenIconList.clear(); +- QListBoxItem* item = m_iconSelector->selectedListBox()->firstItem(); +- for (; item; item = item->next()) ++ for(QListBoxItem* item = m_iconSelector->availableListBox()->firstItem(); ++ item; ++ item = item->next()) + { +- m_hiddenIconList.append(item->text()); ++ if( windowNameToClass.contains(item->text())) ++ m_hiddenIconList.append(windowNameToClass[item->text()]); ++ else ++ m_hiddenIconList.append(item->text()); + } + conf->writeEntry("Hidden", m_hiddenIconList); + conf->sync(); +@@ -416,6 +438,9 @@ void SystemTrayApplet::loadSettings() + conf->setGroup("HiddenTrayIcons"); + m_hiddenIconList = conf->readListEntry("Hidden"); + ++ conf->setGroup("SortedTrayIcons"); ++ m_sortOrderIconList = conf->readListEntry("SortOrder"); ++ + //Note This setting comes from kdeglobal. + conf->setGroup("System Tray"); + m_iconSize = conf->readNumEntry("systrayIconWidth", 22); +@@ -505,7 +530,9 @@ bool SystemTrayApplet::isWinManaged(WId + + bool SystemTrayApplet::shouldHide(WId w) + { +- return m_hiddenIconList.find(KWin::windowInfo(w).name()) != m_hiddenIconList.end(); ++ return m_hiddenIconList.find(KWin::windowInfo(w).name()) != m_hiddenIconList.end() ++ || m_hiddenIconList.find('!'+KWin::windowInfo(w,0,NET::WM2WindowClass).windowClassClass()) ++ != m_hiddenIconList.end(); + } + + void SystemTrayApplet::updateVisibleWins() +@@ -529,6 +556,35 @@ void SystemTrayApplet::updateVisibleWins + (*emb)->hide(); + } + } ++ ++ QMap< QXEmbed*, QString > names; // cache window names and classes ++ QMap< QXEmbed*, QString > classes; ++ for( TrayEmbedList::const_iterator it = m_shownWins.begin(); ++ it != m_shownWins.end(); ++ ++it ) { ++ KWin::WindowInfo info = KWin::windowInfo((*it)->embeddedWinId(),NET::WMName,NET::WM2WindowClass); ++ names[ *it ] = info.name(); ++ classes[ *it ] = '!'+info.windowClassClass(); ++ } ++ TrayEmbedList newList; ++ for( QStringList::const_iterator it1 = m_sortOrderIconList.begin(); ++ it1 != m_sortOrderIconList.end(); ++ ++it1 ) { ++ for( TrayEmbedList::iterator it2 = m_shownWins.begin(); ++ it2 != m_shownWins.end(); ++ ) { ++ if( (*it1).startsWith("!") ? classes[ *it2 ] == *it1 : names[ *it2 ] == *it1 ) { ++ newList.append( *it2 ); // don't bail out, there may be multiple ones ++ it2 = m_shownWins.erase( it2 ); ++ } else ++ ++it2; ++ } ++ } ++ for( TrayEmbedList::const_iterator it = m_shownWins.begin(); ++ it != m_shownWins.end(); ++ ++it ) ++ newList.append( *it ); // append unsorted items ++ m_shownWins = newList; + } + + void SystemTrayApplet::toggleExpanded() +Index: kicker/applets/systemtray/systemtrayapplet.h +=================================================================== +--- kicker/applets/systemtray/systemtrayapplet.h.orig ++++ kicker/applets/systemtray/systemtrayapplet.h +@@ -97,6 +97,7 @@ private: + TrayEmbedList m_shownWins; + TrayEmbedList m_hiddenWins; + QStringList m_hiddenIconList; ++ QStringList m_sortOrderIconList; + KWinModule *kwin_module; + Atom net_system_tray_selection; + Atom net_system_tray_opcode; diff --git a/opensuse/core/tdebase/taskbar.patch b/opensuse/core/tdebase/taskbar.patch new file mode 100644 index 000000000..f8e526e6d --- /dev/null +++ b/opensuse/core/tdebase/taskbar.patch @@ -0,0 +1,29 @@ +--- kicker/taskbar/taskcontainer.cpp.orig 2011-02-12 00:40:57.060389620 +0300 ++++ kicker/taskbar/taskcontainer.cpp 2011-02-12 02:03:08.345389684 +0300 +@@ -576,9 +576,9 @@ + // draw button background + if (drawButton) + { +- style().drawPrimitive(QStyle::PE_HeaderSection, p, +- QRect(0, 0, width(), height()), +- colors); ++ style().drawPrimitive(QStyle::PE_HeaderSection, p, ++ QRect(1, 1, width()-2, height()-2), ++ colors, sunken ? QStyle::Style_Down : QStyle::Style_Raised); + } + + // shift button label on sunken buttons +@@ -674,11 +674,11 @@ + } + else + { +- textPen = p->pen(); ++ textPen = QPen(colors.buttonText()); //textPen = p->pen(); + } + } + +- int availableWidth = width() - (br.x() * 2) - textPos; ++ int availableWidth = width() - (br.x() * 2) - textPos - 4; + if (m_filteredTasks.count() > 1) + { + availableWidth -= 8; diff --git a/opensuse/core/tdebase/tdebase.changes b/opensuse/core/tdebase/tdebase.changes new file mode 100644 index 000000000..5c3add7de --- /dev/null +++ b/opensuse/core/tdebase/tdebase.changes @@ -0,0 +1,5422 @@ +------------------------------------------------------------------- +Wed Aug 17 02:38:36 UTC 2011 - anixx@opensuse.org + +- reenable and repair MTAB watching in fstab plugin for media autodetection without HAL + +------------------------------------------------------------------- +Tue Jul 26 10:26:42 UTC 2011 - anixx@opensuse.org + +- add dependency on libusb-compat-devel to restore Logitech mouse support +- add a simlink to the screensavers directory to fix the issue of their sudden disappearance + +------------------------------------------------------------------- +Thu Jun 9 18:59:49 UTC 2011 - coolo@novell.com + +- do not require something we don't build in factory + +------------------------------------------------------------------- +Wed Jun 1 09:41:05 UTC 2011 - anixx@opensuse.org + +- make hal usage conditional on the project + +------------------------------------------------------------------- +Tue May 31 12:41:04 UTC 2011 - coolo@novell.com + +- remove hal support for 12.1 and some cleanup for long gone distributions + +------------------------------------------------------------------- +Thu Mar 10 08:49:11 UTC 2011 - neptunia@mail.ru + +- fix build + +------------------------------------------------------------------- +Thu Sep 23 00:15:01 CEST 2010 - hpj@urpla.net + +- attempt to fix flashplayer dysfunction + +------------------------------------------------------------------- +Fri Aug 13 17:03:58 UTC 2010 - neptunia@mail.ru + +- removing dependencies on KDE4, restoring ksysguardd but without strict dependency + +------------------------------------------------------------------- +Tue Aug 10 06:04:35 UTC 2010 - beineri@opensuse.org + +- Drop dependencies on Beagle for 11.4 + +------------------------------------------------------------------- +Mon Apr 19 18:51:14 UTC 2010 - tittiatcoke@gmail.com + +- Added patch to enable build with openssl 1.0 + +------------------------------------------------------------------- +Tue Mar 23 12:45:11 UTC 2010 - llunak@novell.com + +- CVE-2010-0436 (bnc#584223) + +------------------------------------------------------------------- +Fri Jan 1 20:09:49 CET 2010 - jengelh@medozas.de + +- package baselibs.conf +- enable full parallel build + +------------------------------------------------------------------- +Fri Nov 20 21:02:01 UTC 2009 - beineri@opensuse.org + +- update patches to apply without fuzz + +------------------------------------------------------------------- +Fri Oct 16 15:07:21 CEST 2009 - llunak@novell.com + +- add .1 to version to allow obsoleting 11.1 version (bnc#529955) + +------------------------------------------------------------------- +Sun Oct 4 06:06:45 UTC 2009 - beineri@opensuse.org + +- make kdebase3-session require kdebase3-workspace (bnc#544173) + +------------------------------------------------------------------- +Thu Jul 23 11:52:14 CEST 2009 - llunak@suse.cz + +- use kdeinit from ksmserver when possible (r967149) + +------------------------------------------------------------------- +Sun Jul 19 12:21:09 CEST 2009 - beineri@opensuse.org + +- fix kdebase3-devel dependencies + +------------------------------------------------------------------- +Sun Jul 12 16:35:28 CEST 2009 - beineri@opensuse.org + +- split off -apps and -workspace sub-packages +- remove some with kde4 packages conflicting man pages + +------------------------------------------------------------------- +Mon Jun 22 07:03:30 CEST 2009 - beineri@opensuse.org + +- remove ancient unversionized obsolete (kdialog) + +------------------------------------------------------------------- +Fri May 29 14:55:51 CEST 2009 - llunak@suse.cz + +- build with gcc 4.4 + +------------------------------------------------------------------- +Mon Apr 20 20:59:26 CEST 2009 - dmueller@suse.de + +- build for SLE_10 without fdupes run + +------------------------------------------------------------------- +Sat Apr 4 17:33:29 CEST 2009 - coolo@suse.de + +- refresh all patches to fix build + +------------------------------------------------------------------- +Thu Dec 11 15:12:11 CET 2008 - dmueller@suse.de + +- fix kdebase3 being pulled in for kde4 installs (bnc#458323) + +------------------------------------------------------------------- +Wed Dec 10 12:34:56 CET 2008 - olh@suse.de + +- use Obsoletes: -XXbit only for ppc64 to help solver during distupgrade + (bnc#437293) + +------------------------------------------------------------------- +Thu Dec 4 12:34:56 CET 2008 - olh@suse.de + +- obsolete old -XXbit packages (bnc#437293) + +------------------------------------------------------------------- +Tue Dec 2 15:07:17 CET 2008 - stbinner@suse.de + +- don't show KNetAttach menu entry on KDE4 desktop + +------------------------------------------------------------------- +Sun Nov 23 17:28:18 CET 2008 - stbinner@suse.de + +- fix build/patch apply on ppc + +------------------------------------------------------------------- +Thu Nov 20 13:59:52 CET 2008 - llunak@suse.cz + +- use KPowersave for suspend if available, so that the screen + is also locked (bnc#326848) + +------------------------------------------------------------------- +Mon Sep 29 10:13:39 CEST 2008 - stbinner@suse.de + +- Update 3_5_BRANCH.diff (bnc#430476) + +------------------------------------------------------------------- +Sun Sep 21 18:56:48 CEST 2008 - wstephenson@suse.de + +- Fix maximum port allowed in knetattach wizard (bnc#335794) + +------------------------------------------------------------------- +Wed Sep 10 00:45:48 CEST 2008 - dmueller@suse.de + +- remove resmgr references from kcheckpass (bnc#422616) + +------------------------------------------------------------------- +Wed Sep 3 00:46:39 CEST 2008 - dmueller@suse.de + +- build against libsensors4 + +------------------------------------------------------------------- +Tue Aug 26 09:46:37 CEST 2008 - llunak@suse.cz + +- fix wallpapers when the number of screens changes (bnc#329221) + +------------------------------------------------------------------- +Sun Aug 24 11:57:13 CEST 2008 - stbinner@suse.de + +- fix build breakage by previous submission +- fix file conflict with kde4-kdm (bnc#411239) + +------------------------------------------------------------------- +Wed Aug 20 18:53:58 CEST 2008 - coolo@suse.de + +- update to KDE 3.5.10 + * many kicker fixes + * translation updates + * desktop files validate + +------------------------------------------------------------------- +Mon Aug 4 13:45:49 CEST 2008 - dmueller@suse.de + +- fix build on 10.2 + +------------------------------------------------------------------- +Thu Jul 24 16:32:56 CEST 2008 - dmueller@suse.de + +- update rotate-wacom pointers patch to work on xrandr 1.2 displays + as well (bnc#385149) + +------------------------------------------------------------------- +Thu Jul 24 16:30:05 CEST 2008 - dmueller@suse.de + +- disable ksysguard openslp patch as it causes hangs + +------------------------------------------------------------------- +Mon Jul 14 00:27:15 CEST 2008 - dmueller@suse.de + +- fix suspend/hibernate buttons for 11.0 and newer (bnc#290917) + +------------------------------------------------------------------- +Wed Jun 11 16:08:14 CEST 2008 - dmueller@suse.de + +- remove kdebase3-nsplugins64 package and add nspluginwrapper + dependency + +------------------------------------------------------------------- +Tue May 20 18:00:46 CEST 2008 - llunak@suse.cz + +- do not always default to kdesu remembering password (bnc#386531) + +------------------------------------------------------------------- +Mon May 19 21:16:25 CEST 2008 - llunak@suse.cz + +- fix broken patch for bnc#332079 + +------------------------------------------------------------------- +Mon May 19 11:15:29 CEST 2008 - thoenig@suse.de + +- add fingerprint reader support: kpamgreeter.diff, + use-pam-before-classic.diff. Closes bnc#339331. + +------------------------------------------------------------------- +Fri May 16 19:25:52 CEST 2008 - dkukawka@suse.de + +- fixed rotate-wacom-pointers.diff to work with current xsetwacom + (bnc#391440) + +------------------------------------------------------------------- +Wed May 14 08:34:36 CEST 2008 - stbinner@suse.de + +- port/renable rotate-wacom-pointers.diff (bnc#385149) + +------------------------------------------------------------------- +Sat May 10 21:37:04 CEST 2008 - stbinner@suse.de + +- move some icons to -runtime because kdelibs3 references them + or they are used in default KDE3 applications on KDE4 desktop + +------------------------------------------------------------------- +Fri May 9 23:46:02 CEST 2008 - dmueller@suse.de + +- fix kdm shutdown being set to "no" during config conversion + +------------------------------------------------------------------- +Fri May 9 10:37:16 CEST 2008 - dmueller@suse.de + +- 3_5_BRANCH.diff update: + * new translations + +------------------------------------------------------------------- +Tue May 6 17:58:58 CEST 2008 - dmueller@suse.de + +- fix uninitialized return in krandrtray + +------------------------------------------------------------------- +Fri May 2 13:49:03 CEST 2008 - llunak@suse.cz + +- avoid kded crash on CD ejecting (bnc#359424) + +------------------------------------------------------------------- +Mon Apr 28 17:48:30 CEST 2008 - llunak@suse.cz + +- switch kdesu backend back to su (bnc#216796) + +------------------------------------------------------------------- +Mon Apr 28 11:15:30 CEST 2008 - dmueller@suse.de + +- add /usr/bin/startkde3 + +------------------------------------------------------------------- +Fri Apr 25 16:38:03 CEST 2008 - dmueller@suse.de + +- update 3_5_BRANCH.diff to include translations +- call xrandr --auto to xvideo issues on xrandr 1.2 setups + +------------------------------------------------------------------- +Thu Apr 17 11:35:35 CEST 2008 - stbinner@suse.de + +- don't build kdebase3-ksysguardd package for 11.0 but require/use + kdebase4-workspace-ksysguardd (bnc#379351) + +------------------------------------------------------------------- +Mon Apr 14 18:09:05 CEST 2008 - llunak@suse.cz + +- improve the low-disk-space dialog (bnc#199054) +- GUI for selecting the WM (bnc#332079) + +------------------------------------------------------------------- +Sun Apr 13 16:10:51 CEST 2008 - dmueller@suse.de + +- fix build against glibc 2.8 +- fix session restore of kde3 apps if kde 4.x is installed + as well + +------------------------------------------------------------------- +Sat Apr 12 08:16:18 CEST 2008 - stbinner@suse.de + +- rename session type from "KDE" to "KDE3" (bnc#379355) + +------------------------------------------------------------------- +Thu Apr 10 12:54:45 CEST 2008 - ro@suse.de + +- added baselibs.conf file to build xxbit packages + for multilib support + +------------------------------------------------------------------- +Thu Apr 3 20:20:28 CEST 2008 - stbinner@suse.de + +- split of misc-console-font subpackage (fate#302474) + +------------------------------------------------------------------- +Thu Apr 3 14:09:47 CEST 2008 - stbinner@suse.de + +- add web shortcut for SourceForge tracker (bnc#331663) + +------------------------------------------------------------------- +Tue Mar 18 19:26:59 CET 2008 - dmueller@suse.de + +- fix shutdown option being reset on each update (bnc#348546) + +------------------------------------------------------------------- +Thu Mar 13 20:29:49 CET 2008 - stbinner@suse.de + +- fix splitting + +------------------------------------------------------------------- +Wed Mar 12 15:29:01 CET 2008 - dmueller@suse.de + +- update 3_5_BRANCH.diff +- further improve kdebase3-runtime splitting + +------------------------------------------------------------------- +Mon Mar 3 11:18:07 CET 2008 - stbinner@suse.de + +- move kreadconfig to kdebase3-runtime + +------------------------------------------------------------------- +Tue Feb 26 14:19:56 CET 2008 - dmueller@suse.de + +- fix sensors support in ksysguardd + +------------------------------------------------------------------- +Mon Feb 18 13:42:36 CET 2008 - dmueller@suse.de + +- add missing split provides + +------------------------------------------------------------------- +Wed Feb 13 23:18:17 CET 2008 - dmueller@suse.de + +- update to 3.5.9 + * bugfixes, translation update + +------------------------------------------------------------------- +Sat Feb 9 06:18:39 CET 2008 - stbinner@suse.de + +- fix position of kdebase3-runtime requirement + +------------------------------------------------------------------- +Fri Feb 8 14:28:23 CET 2008 - stbinner@suse.de + +- split off few parts like KIO-slaves into kdebase3-runtime package + +------------------------------------------------------------------- +Mon Jan 28 12:04:32 CET 2008 - stbinner@suse.de + +- fix build against libbeagle 0.3 + +------------------------------------------------------------------- +Thu Jan 17 10:53:53 CET 2008 - stbinner@suse.de + +- update 3_5_BRANCH.diff for 64bit Flash fixes + +------------------------------------------------------------------- +Wed Jan 2 08:37:44 CET 2008 - stbinner@suse.de + +- add 3_5_BRANCH.diff to pick up nsplugin fixes for Flash + +------------------------------------------------------------------- +Wed Dec 5 12:05:45 CET 2007 - wstephenson@suse.de + +- Remove spurious openldap2, pcsc-lite and libsmbclient build + requirements. + +------------------------------------------------------------------- +Sat Nov 24 20:09:11 CET 2007 - coolo@suse.de + +- require liblazy-devel on 10.3+ + +------------------------------------------------------------------- +Wed Nov 21 14:15:29 CET 2007 - stbinner@suse.de + +- fix build for < 11.0 + +------------------------------------------------------------------- +Fri Nov 16 16:22:06 CET 2007 - tpatzig@suse.de + +- fix, no kryptomedia for already decrypted raid devices (#308196) + +------------------------------------------------------------------- +Fri Nov 16 13:12:13 CET 2007 - dmueller@suse.de + +- remove unneeded source file + +------------------------------------------------------------------- +Fri Nov 2 15:47:22 CET 2007 - jdelvare@suse.de + +- libsensors is in a separate package now. + +------------------------------------------------------------------- +Tue Oct 23 11:42:05 CEST 2007 - stbinner@suse.de + +- fix build with gcc 4.3 +- fix Konqueror not generating previews of b/w photos (#334965) + +------------------------------------------------------------------- +Sat Oct 20 15:24:18 CEST 2007 - schwab@suse.de + +- Remove invalid delete in ~NSPluginStreamBase. + +------------------------------------------------------------------- +Tue Oct 9 11:31:40 CEST 2007 - stbinner@suse.de + +- fix Kickoff layout for Xinerama (#254215) +- update to KDE 3.5.8: bugfixes in pop3 and smtp kio slaves, Kate, + kcontrol, kdesktop, kdm, kwin, Konsole and Konqueror + +------------------------------------------------------------------- +Fri Sep 21 16:19:20 CEST 2007 - stbinner@suse.de + +- fix parameter handling in input field of Kickoff (#325633) + +------------------------------------------------------------------- +Fri Sep 21 15:58:29 CEST 2007 - dmueller@suse.de + +- fix kded crashes on resume when kpowersave is installed (#326488) +- fix Window domain listing in kdm (#292084) + +------------------------------------------------------------------- +Thu Sep 20 19:25:35 CEST 2007 - tpatzig@suse.de + +- update for already mounted crypto_LUKS patch (#308196) + +------------------------------------------------------------------- +Wed Sep 19 22:35:54 CEST 2007 - dmueller@suse.de + +- fix arts being started twice/running after logout (#178930) + +------------------------------------------------------------------- +Wed Sep 19 22:17:03 CEST 2007 - tpatzig@suse.de + +- fix to safely remove (teardown) crypted volumes (#306641) + +------------------------------------------------------------------- +Wed Sep 19 15:56:04 CEST 2007 - dmueller@suse.de + +- fix kdm autologin vulnerability (#307372, CVE-2007-4569) + +------------------------------------------------------------------- +Wed Sep 19 10:50:37 CEST 2007 - stbinner@suse.de + +- fix Kickoff problems with secondary screen (#232446) +- replace khc_beagle-*.py with Perl versions for one CD install + +------------------------------------------------------------------- +Fri Sep 14 15:01:18 CEST 2007 - tpatzig@suse.de + +- let mediamamanger check if crypto_LUKS vol is already mounted + before running kryptomedia-dialog (#308196) + +------------------------------------------------------------------- +Tue Sep 11 13:07:23 CEST 2007 - stbinner@suse.de + +- show folder_man icon in system:/ slave for Documents (#304656) + +------------------------------------------------------------------- +Tue Sep 11 12:12:23 CEST 2007 - dmueller@suse.de + +- reorder patches to apply properly even without uncommitted patches + +------------------------------------------------------------------- +Fri Sep 7 17:47:55 CEST 2007 - dmueller@suse.de + +- fix kdm crash on vnc login (#301374) +- fix DISPLAYMANAGER_SHUTDOWN to work like documented (#308257) + +------------------------------------------------------------------- +Thu Aug 30 16:37:13 CEST 2007 - llunak@suse.cz + +- avoid excessive X errors from kicker (#299594) + +------------------------------------------------------------------- +Tue Aug 28 15:29:19 CEST 2007 - stbinner@suse.de + +- change Kickoff's "Home Folder" and "My Document" icons (#304656) +- check if netscape plugins have changed (eg by YOU) (#296425) + +------------------------------------------------------------------- +Sat Aug 25 11:41:45 CEST 2007 - stbinner@suse.de + +- reorder default Kickoff favorites: Firefox first, Help not last + +------------------------------------------------------------------- +Wed Aug 22 15:42:31 CEST 2007 - stbinner@suse.de + +- don't try to overwrite desktop icons during setup (#278109) +- Lock/Logout applet defaults to wrong button order (#302179) +- don't check for khelpcenter index at application start + +------------------------------------------------------------------- +Sun Aug 19 09:38:47 CEST 2007 - stbinner@suse.de + +- fix build on older distributions +- don't show progress indicator when creating initial desktop icons + +------------------------------------------------------------------- +Thu Aug 16 12:12:05 CEST 2007 - hmacht@suse.de + +- adjust to new liblazy API due to new PolicyKit (>=0.4) (#299733) + +------------------------------------------------------------------- +Tue Aug 14 09:17:54 CEST 2007 - stbinner@suse.de + +- don't package obsolete (x)emacs icons (#299941) +- align kdm user list labels (#294421) +- kxkb: "Include Latin layout" by default for new layouts (#204402) +- fix opening of media with non UTF name (#297886) + +------------------------------------------------------------------- +Fri Aug 10 17:47:36 CEST 2007 - dmueller@suse.de + +- actually enable the consolekit patch (d'oh) + +------------------------------------------------------------------- +Wed Aug 8 18:03:11 CEST 2007 - stbinner@suse.de + +- show "Install Software" menu item within Kickoff "Computer" tab +- don't show "missing icon" icon when an entry icon cannot be found + +------------------------------------------------------------------- +Mon Aug 6 18:43:51 CEST 2007 - dmueller@suse.de + +- add krandr 0.5.2.1 (part of fate 300481) + +------------------------------------------------------------------- +Sat Aug 4 18:49:16 CEST 2007 - stbinner@suse.de + +- update 3_5_BRANCH.diff a last time before freeze + +------------------------------------------------------------------- +Fri Aug 3 15:47:22 CEST 2007 - dmueller@suse.de + +- notify consolekit of logged in users + +------------------------------------------------------------------- +Fri Jul 27 13:56:11 CEST 2007 - stbinner@suse.de + +- add color scheme support to kdm greeter themes (#294421) + +------------------------------------------------------------------- +Mon Jul 16 13:52:32 CEST 2007 - stbinner@suse.de + +- ensure that correct kcmshell is called (#277292) + +------------------------------------------------------------------- +Mon Jul 16 11:39:13 CEST 2007 - dmueller@suse.de + +- update from 3.5 branch to include bugfixes (#287193) + +------------------------------------------------------------------- +Fri Jul 13 11:45:20 CEST 2007 - stbinner@suse.de + +- activate text completion editor in mini-CLI and Konqueror URL bar + +------------------------------------------------------------------- +Thu Jul 12 11:40:17 CEST 2007 - stbinner@suse.de + +- fix ugly scaled remote:/ image in kickoff (#258462) + +------------------------------------------------------------------- +Tue Jul 10 07:07:57 CEST 2007 - stbinner@suse.de + +- fix build on SUSE_Linux_10.0 + +------------------------------------------------------------------- +Thu Jun 21 18:20:58 CEST 2007 - stbinner@suse.de + +- fix invalid .desktop files + +------------------------------------------------------------------- +Wed Jun 20 11:58:22 CEST 2007 - stbinner@suse.de + +- remove kappfinder data (#285831) +- fix build on older distributions + +------------------------------------------------------------------- +Wed Jun 20 11:25:27 CEST 2007 - coolo@suse.de + +- don't install earlykdm anymore and rely on preload to provide + an early start + +------------------------------------------------------------------- +Tue Jun 19 18:12:42 CEST 2007 - dmueller@suse.de + +- 3_5_BRANCH update (#282305) + +------------------------------------------------------------------- +Sat Jun 16 17:23:30 CEST 2007 - coolo@suse.de + +- don't require kbd to run + +------------------------------------------------------------------- +Wed Jun 13 18:42:31 CEST 2007 - dmueller@suse.de + +- fix duplicate files in package +- don't install config files as executable +- fix untranslated wallpaper desktop files +- add missing ldconfig call to %postun +- add missing %stop_on_removal to kdm + +------------------------------------------------------------------- +Thu Jun 7 05:37:53 CEST 2007 - stbinner@suse.de + +- move konqueror.desktop back to old position (#281572) + +------------------------------------------------------------------- +Wed Jun 6 15:15:06 CEST 2007 - dmueller@suse.de + +- fix syslog autodetection in init.earlykdm script + +------------------------------------------------------------------- +Mon Jun 4 14:32:55 CEST 2007 - stbinner@suse.de + +- move kde_post_install + +------------------------------------------------------------------- +Fri Jun 1 17:57:46 CEST 2007 - dmueller@suse.de + +- update 3_5_BRANCH.diff + * build fix + +------------------------------------------------------------------- +Thu May 24 21:32:01 CEST 2007 - wstephenson@suse.de + +- Revised offline mode infrastructure (#237274) + +------------------------------------------------------------------- +Wed May 23 22:59:23 CEST 2007 - stbinner@suse.de + +- fix build requires + +------------------------------------------------------------------- +Mon May 16 22:38:26 CEST 2007 - stbinner@suse.de + +- update to 3.5.7: + * kicker: Added option to change font color used by taskbar applet + * kwin: Option to turn off alt+tab outline. + * several bugfixes in all applications +- update xinerama.patch: fix handling of SeparateScreenFocus option +- update kickoff.diff from SVN +- only default shortcuts to switch to first 10 desktops (#275705) + +------------------------------------------------------------------- +Tue May 15 14:06:01 CEST 2007 - dmueller@suse.de + +- drop python requirement +- only install kdebase3-beagle when both kdebase3 and beagle + are selected + +------------------------------------------------------------------- +Thu May 10 14:20:13 CEST 2007 - stbinner@suse.de + +- add audit log support to kdm (#263180) + +------------------------------------------------------------------- +Thu Apr 26 23:23:31 CEST 2007 - dmueller@suse.de + +- fix build for 10.3 + +------------------------------------------------------------------- +Wed Apr 25 16:29:22 CEST 2007 - stbinner@suse.de + +- fix build for < 10.2 + +------------------------------------------------------------------- +Wed Apr 18 21:31:30 CEST 2007 - dmueller@suse.de + +- reapply konsole font color update + +------------------------------------------------------------------- +Mon Apr 16 13:32:51 CEST 2007 - dmueller@suse.de + +- build kfontinst against libfontenc again + +------------------------------------------------------------------- +Thu Apr 12 13:20:52 CEST 2007 - stbinner@suse.de + +- don't include kdm/sessions/enlightenment.desktop (#259717) +- default to UTF-8 encoding for spellchecking (#261217) + +------------------------------------------------------------------- +Thu Apr 5 15:22:27 CEST 2007 - stbinner@suse.de + +- simplify resize and rotate settings dialog (#104926) + +------------------------------------------------------------------- +Tue Apr 3 18:25:30 CEST 2007 - stbinner@suse.de + +- update 3_5_BRANCH.diff +- update kickoff.diff from SVN: + * prefer user over system media label (#257007) + * implement listening to Beagle KAddressbook hits and do not + search addressbooks via kabc by default (#249287) + * make drawing of Geeko eye an option with default off + +------------------------------------------------------------------- +Fri Mar 30 20:06:41 CEST 2007 - wstephenson@suse.de + +- Add fix for dbus error message after resume (#223775) + +------------------------------------------------------------------- +Sun Mar 25 09:28:48 CEST 2007 - aj@suse.de + +- Add libbz2-devel to BuildRequires for 10.3 and newer. + +------------------------------------------------------------------- +Fri Mar 16 16:18:08 CET 2007 - stbinner@suse.de + +- update Kickoff from SVN: + * don't allow "Switch/Reboot to foo" items as Favorites + * distinct icons for suspend to ram and disk (#229966) +- fix "cannot login with KDM after wrong password" (#229245) +- fix kcmkdm not defaulting to Grub (#230715) + +------------------------------------------------------------------- +Thu Mar 9 17:23:58 CET 2007 - stbinner@suse.de + +- fix build (new icon location check) +- don't duplicate /opt/kde3/bin in PATH (#251358) +- solve #216489 problem in a more generic, path independent way + +------------------------------------------------------------------- +Wed Mar 7 15:48:00 CET 2007 - dmueller@suse.de + +- adjust patsh for gnome help integration (#251117) + +------------------------------------------------------------------- +Mon Mar 5 13:11:44 CET 2007 - stbinner@suse.de + +- /usr/share/xsessions is now already part of filesystem RPM + +------------------------------------------------------------------- +Tue Feb 20 15:21:07 CET 2007 - stbinner@suse.de + +- add "PATH=/opt/kde3/bin:$PATH" to startkde script + +------------------------------------------------------------------- +Fri Feb 9 17:53:24 CET 2007 - stbinner@suse.de + +- new Kickoff option: "KickoffSearchAddressBook=false" disables kabc + search for people who are annoyed by KMail being started by the menu + +------------------------------------------------------------------- +Wed Feb 7 15:05:39 CET 2007 - dmueller@suse.de + +- fix build + +------------------------------------------------------------------- +Mon Feb 5 19:30:47 CET 2007 - dmueller@suse.de + +- fix kde-window-decorator detection +- re-apply 3.5 branch diff + +------------------------------------------------------------------- +Fri Feb 2 14:19:16 CET 2007 - dmueller@suse.de + +- update 3_5_BRANCH diff +- fix low diskspace patch (#226766) + +------------------------------------------------------------------- +Tue Jan 30 14:40:12 CET 2007 - stbinner@suse.de + +- show konqfilemgr.desktop in the menu + +------------------------------------------------------------------- +Fri Jan 26 10:58:09 CET 2007 - coolo@suse.de + +- making kdmrc noreplace as genkdmconf will update the config + anyway (#224505) + +------------------------------------------------------------------- +Mon Jan 22 11:37:44 CET 2007 - stbinner@suse.de + +- update to 3.5.6 release: + * kicker: more support for compiz, fix systray flicker + * kwin: claim _NET_WM_CM_Sn when compositing, bug fixes + * kate: added session chooser panel applet and KMenu extension + * kcontrol: Fonts settings module by default does not affect + system-wide font rendering settings. + * several bugfixes within kdesktop, konqueror, konsole, fish:/, + kfind and ksysguard + +------------------------------------------------------------------- +Thu Jan 18 11:06:28 CET 2007 - dgollub@suse.de + +- fixed typo in crypto support for media manager + +------------------------------------------------------------------- +Tue Jan 16 13:40:48 CET 2007 - dmueller@suse.de + +- add crypto media handling (fate #253) +- konsole color scheme update (experimental) +- start kde-window-decorator for compiz startup + +------------------------------------------------------------------- +Tue Jan 16 02:58:56 CET 2007 - ltinkl@suse.cz + +- update patch to fix #215262 + +------------------------------------------------------------------- +Sat Jan 13 20:22:24 CET 2007 - stbinner@suse.de + +- context menu entry in lock/lockout applet to switch button order + +------------------------------------------------------------------- +Thu Jan 11 19:21:26 CET 2007 - stbinner@suse.de + +- make krandrtray also rotate wacom-input devices (Fate #300713) + +------------------------------------------------------------------- +Tue Jan 9 11:36:30 CET 2007 - stbinner@suse.de + +- fix fish:// does not support files larger than 2 Gb (#230941) +- update of kickoff.diff from SVN: + * fix keyboard navigation in app browser (#227891) + * option to not switch tabs on hover (KickoffSwitchTabsOnHover) + +------------------------------------------------------------------- +Thu Jan 4 22:42:16 CET 2007 - stbinner@suse.de + +- update of kickoff.diff and kickoff-data.tar.bz2 from SVN: + * always show most recently used items, never frequently (#227829) + * fix order of appplication history and reboot options (#227826) + * don't require restart to show/hide "Save Session" (#228829) + * re-add lost "click on tab switches to flip top level" feature + * switch back to top level when changing to exit view via accell + * darker (instead of lighter) resize stripes for better visibility + * added non-GUI options (require restart): kickerrc, [General] + "KickoffFontPointSizeOffset=3" increases, negative decreases + "KickoffTabBarFormat={LabelAndIcon,LabelOnly,IconOnly}" + +------------------------------------------------------------------- +Thu Jan 4 14:41:52 CET 2007 - stbinner@suse.de + +- allow to configure/disable session confirmations in ksmserverrc: + [General] + confirmLogoutDelay=0 + confirmRebootDelay=11 + confirmShutdownDelay=11 + +------------------------------------------------------------------- +Mon Dec 18 18:44:45 CET 2006 - llunak@suse.cz + +- handle custom browser specified as .desktop file (#224897) + +------------------------------------------------------------------- +Mon Dec 11 15:09:30 CET 2006 - stbinner@suse.de + +- unbreak mach_blass_legacy.diff (revert brain damage) + +------------------------------------------------------------------- +Wed Dec 6 11:46:50 CET 2006 - stbinner@suse.de + +- make KDE protocol information use enhanced_browsing icon (#186707) +- use upstream logout effect for 8-bit displays (#214543) + +------------------------------------------------------------------- +Mon Dec 4 11:25:43 CET 2006 - stbinner@suse.de + +- remove UnitedLinux cruft from spec file +- ksmserver: escape "&" properly in grub partition label +- fix more the build for < 10.1 + +------------------------------------------------------------------- +Fri Dec 1 10:09:23 CET 2006 - stbinner@suse.de + +- fix build for < 10.1 + +------------------------------------------------------------------- +Fri Dec 1 04:20:22 CET 2006 - dmueller@suse.de + +- fix drag&drop of favourites on tab regression in kickoff +- fix tooltips sometimes disappearing (#221616) + +------------------------------------------------------------------- +Mon Nov 27 22:14:12 CET 2006 - dmueller@suse.de + +- refresh ksmserver-timed.diff to apply properly + +------------------------------------------------------------------- +Mon Nov 27 17:53:03 CET 2006 - dmueller@suse.de + +- fix translation issue in kickoff Leave tab (#221299) +- fix kickoff tab labels not being drawn centered +- add (hidden) option to disable flip animation + +------------------------------------------------------------------- +Mon Nov 27 17:24:17 CET 2006 - stbinner@suse.de + +- set all logout/shutdown/restart delays to 30 seconds + +------------------------------------------------------------------- +Sat Nov 25 13:32:52 CET 2006 - coolo@suse.de + +- correctly handle media mounted on startup (#223413) + +------------------------------------------------------------------- +Fri Nov 24 10:43:42 CET 2006 - coolo@suse.de + +- correctly follow font sizes in the logout dialog (#222496) + +------------------------------------------------------------------- +Fri Nov 24 08:55:19 CET 2006 - stbinner@suse.de + +- add direct "Requires: Beagle" for kdebase3-beagle package + +------------------------------------------------------------------- +Thu Nov 23 18:59:07 CET 2006 - coolo@suse.de + +- fix highly visible X after dpms kicks out again (#222623 also + reported by ro and various others) + +------------------------------------------------------------------- +Thu Nov 23 16:43:03 CET 2006 - dmueller@suse.de + +- fix kickoff sloppy region also in alternative layout +- use system language in kdm (#223445) +- revert change from 3.5 branch to show media icons (#223413) + +------------------------------------------------------------------- +Wed Nov 22 04:50:20 CET 2006 - ltinkl@suse.cz + +- implement two requested DCOp functions for +#215262 - Suspend to disk with attached usb storage not working + +------------------------------------------------------------------- +Tue Nov 21 13:53:58 CET 2006 - dmueller@suse.de + +- fix another typo (#222686) + +------------------------------------------------------------------- +Tue Nov 21 13:18:31 CET 2006 - dmueller@suse.de + +- fix typo in i18n string (#222686) +- trigger the kmenu when the greeter closes to avoid focus handling + locks + +------------------------------------------------------------------- +Mon Nov 20 22:16:43 CET 2006 - llunak@suse.cz + +- update the updater autostart utility (#219390) + +------------------------------------------------------------------- +Mon Nov 20 17:12:05 CET 2006 - dmueller@suse.de + +- improve application scoring (#221252) +- fix kickoff button flicker (#221287) +- fix kickoff button not flipped in top position (#221209) +- fix some RTL issues with kickoff (#219415) +- hide dpms module if kpowersave is messing with DPMS (#167919) + +------------------------------------------------------------------- +Mon Nov 20 16:01:38 CET 2006 - ltinkl@suse.cz + +- fix #218243 - insserv: Service earlykbd has to be enabled for + service earlykdm + +------------------------------------------------------------------- +Thu Nov 16 18:18:02 CET 2006 - llunak@suse.cz + +- add autostart utility to launch the right updater tool (#219390) +- fix 3_5_BRANCH_kde_128648.diff to avoid KDE#137119 +- fix systray_order.diff to also immediately place properly + zen-updater or other XDG systray apps +- require root password for shutdown by default (#220268) +- fix shell insertion vulnerability in khelpcenter (#218764) + +------------------------------------------------------------------- +Wed Nov 15 21:14:08 CET 2006 - dmueller@suse.de + +- permissions %post for fileshareset (#221129) + +------------------------------------------------------------------- +Tue Nov 14 11:39:06 CET 2006 - dmueller@suse.de + +- update to current optional-kwin.diff (#219020) +- fix more minipager issues with compiz +- fix more shell insertion issues with khelpcenter + +------------------------------------------------------------------- +Tue Nov 14 10:43:27 CET 2006 - ltinkl@suse.cz + +- fixed #218764 - shell insertion vulnerability in khelpcenter + +------------------------------------------------------------------- +Mon Nov 13 23:50:32 CET 2006 - dmueller@suse.de + +- update optional kwin diff to add custom start script support + (#219020) + +------------------------------------------------------------------- +Mon Nov 13 17:41:17 CET 2006 - dmueller@suse.de + +- update kickoff diff to include button-hover fix + +------------------------------------------------------------------- +Mon Nov 13 13:50:44 CET 2006 - dmueller@suse.de + +- update kickoff diff to include latest fixes (#219709) + +------------------------------------------------------------------- +Fri Nov 10 18:56:21 CET 2006 - llunak@suse.cz + +- fix kompmgr leaks (#197990) + +------------------------------------------------------------------- +Fri Nov 10 15:40:30 CET 2006 - llunak@suse.cz + +- make kompmgr read default settings from /etc/opt/kde3/... . +- fix clickraise with compositing (KDE#128648) +- fix possible infinite loop in kompmgr +- composite manager selection in kompmgr +- fix focus chain when opening links in background + +------------------------------------------------------------------- +Thu Nov 9 14:59:02 CET 2006 - stbinner@suse.de + +- fix Kicker default behavior: don't turn on right hide button +- restore parens for NameAndDescription format in Kicker (#213450) +- remove historic "Provides:"/"Obsoletes:" (#218798) + +------------------------------------------------------------------- +Tue Nov 7 16:28:21 CET 2006 - coolo@suse.de + +- only show "you're running out of disk space" dialog once (#218185) + +------------------------------------------------------------------- +Tue Nov 7 14:22:18 CET 2006 - coolo@suse.de + +- mount USB devices again to find out if they are cameras (#217731) +- mount devices on startup too (#179427) + +------------------------------------------------------------------- +Mon Nov 6 12:06:47 CET 2006 - dmueller@suse.de + +- switch kickoff to style based theming +- improve error message upon media:/ errors (#218179) +- fix kerberos refresh problem in kcheckpass (#203570) + +------------------------------------------------------------------- +Sat Nov 4 19:30:12 CET 2006 - stbinner@suse.de + +- fix build for < 10.2 +- fix drag & drop print with utf-8 name (#194400) +- fix systray flicker (#216669) + +------------------------------------------------------------------- +Fri Nov 3 16:09:00 CET 2006 - dmueller@suse.de + +- readd kickoff kcontrol module + +------------------------------------------------------------------- +Thu Nov 2 15:38:25 CET 2006 - stbinner@suse.de + +- show complete wallpaper name in desktop configuration (#103202) +- let lockout applet call again kdm dialog on left click (#215058) + +------------------------------------------------------------------- +Thu Nov 2 15:22:48 CET 2006 - coolo@suse.de + +- don't crash on 8bit displays (#210209) +- don't pollute log/messages with debug (#217035) +- update kdm config patch to fix root login (#208279) +- update ksmserver patch to fix the layout of the logout confirmation + +------------------------------------------------------------------- +Tue Oct 31 14:55:21 CET 2006 - dmueller@suse.de + +- fix kdesu prompt again (#216563) + +------------------------------------------------------------------- +Tue Oct 31 12:49:22 CET 2006 - coolo@suse.de + +- update 3.5 branch and kickoff diff to fix restart (#216092) + +------------------------------------------------------------------- +Mon Oct 30 16:28:05 CET 2006 - coolo@suse.de + +- don't install your own xdm-xp (#192400) + +------------------------------------------------------------------- +Mon Oct 30 11:05:35 CET 2006 - coolo@suse.de + +- update kdm patch to make it quilt ready +- update kickoff.diff for suspend (#215065) +- update 3.5 branch diff to fix + - "set as wallpaper" does not work (#215286) + +------------------------------------------------------------------- +Sun Oct 29 07:48:47 CET 2006 - aj@suse.de + +- Fix kdm-sysconfig-values.diff patch to fix build. + +------------------------------------------------------------------- +Fri Oct 27 10:30:11 CEST 2006 - dmueller@suse.de + +- update 3_5_BRANCH to fix accessibility beeping +- fix Home not showing up in kickoff favourites +- disable accessibility without kdeaccessibility3 (#213622) +- resort some patches +- KDM provides suspend to disk/RAM (fate #300629) +- umount partitions from USB when suspending (fate #300647) +- beagle support in khelpcenter (fate #301208) + +------------------------------------------------------------------- +Tue Oct 24 18:20:56 CEST 2006 - dmueller@suse.de + +- update WM configuration patch +------------------------------------------------------------------- +Tue Oct 24 10:09:57 CEST 2006 - coolo@suse.de + +- update kdm config patch + +------------------------------------------------------------------- +Mon Oct 23 18:16:14 CEST 2006 - dmueller@suse.de + +- add patch for kdm config update problem (#211874) +- add patch for WM configuration in session (FATE 301137) + +------------------------------------------------------------------- +Mon Oct 23 17:25:49 CEST 2006 - dmueller@suse.de + +- adding more default actions for khotkeys to support laptop + extra keys by default (#210875) + +------------------------------------------------------------------- +Mon Oct 23 10:43:34 CEST 2006 - stbinner@suse.de + +- fix file globbing build +- fix build for SUSE < 10.1 + +------------------------------------------------------------------- +Sun Oct 22 23:42:59 CEST 2006 - llunak@suse.cz + +- remove patches disable-kcm-modules.diff and close-use-yast2.diff + that made clock applet use yast timezone module +- patch KDE clock configuration to integrate better with SUSE + (#213897) +- update 3_5_branch diff to include clock fix for picking up + timzone changes (#213897) +- add patch for desktop lock to use xvkbd on tablet pc's (#213677) + +------------------------------------------------------------------- +Fri Oct 20 19:18:44 CEST 2006 - stbinner@suse.de + +- add reboot option parameter to ksm-server-timed.diff dcop call +- update kickoff.diff from SVN: + * if all hits are in same category show double amount of entries + * open Kerry showing only results of selected category link + * add categories for (k)notes and videos + * change logout/shutdown/restart to confirmation with timer + * implement switch user and reboot to other partition + +------------------------------------------------------------------- +Fri Oct 20 12:53:03 CEST 2006 - stbinner@suse.de + +- let logout applet call timed logout in ksmserver + +------------------------------------------------------------------- +Tue Oct 17 17:22:33 CEST 2006 - llunak@suse.cz + +- updates to the systray ordering patch + +------------------------------------------------------------------- +Mon Oct 16 12:49:25 CEST 2006 - stbinner@suse.de + +- update kickoff.diff from SVN and break it into parts + +------------------------------------------------------------------- +Fri Oct 13 18:50:18 CEST 2006 - llunak@suse.cz + +- add patch for KDE#135250 to 3_5 branch diff +- systray ordering (fate #301154) + +------------------------------------------------------------------- +Thu Oct 12 15:36:32 CEST 2006 - stbinner@suse.de + +- change Home.desktop type to URL (#158487) + +------------------------------------------------------------------- +Tue Oct 10 15:36:15 CEST 2006 - coolo@suse.de + +- add patch to provide a timed logout mode to ksmserver + +------------------------------------------------------------------- +Mon Oct 9 11:53:13 CEST 2006 - coolo@suse.de + +- update 3_5 branch diff to include + - show all user mountable devices in fstab (#204376) + +------------------------------------------------------------------- +Sat Oct 7 20:06:06 CEST 2006 - stbinner@suse.de + +- update to next 3.5.5 release tarball + - changes to Kicker tip showing/switching and systemtray + - give focus to OK button in media notifier + +------------------------------------------------------------------- +Fri Oct 6 14:22:36 CEST 2006 - coolo@suse.de + +- update to next 3.5.5 release tarball + - kdesu fixes + - kicker pager fix +- fix kdm config reader to only reset changes in kdmrc once + +------------------------------------------------------------------- +Wed Oct 4 15:15:35 CEST 2006 - hmacht@suse.de + +- new ksmserver-suspend.diff: + - query HAL for suspend capabilities and trigger sleep via HAL + - dependency to liblazy instead of powersave-devel for > 10.1 +- renname existing ksmserver-suspend.diff to + ksmserver-suspend_legacy-10.1.diff for 10.1 + +------------------------------------------------------------------- +Wed Oct 4 14:43:08 CEST 2006 - coolo@suse.de + +- let kdm start Xgl if configured so + +------------------------------------------------------------------- +Wed Oct 4 11:49:47 CEST 2006 - dmueller@suse.de + +- update 3_5_BRANCH.diff to include kicker minipager fixlets + +------------------------------------------------------------------- +Tue Oct 3 10:14:26 CEST 2006 - stbinner@suse.de + +- update to 3.5.5 release tarball + +------------------------------------------------------------------- +Sun Oct 1 17:48:20 CEST 2006 - stbinner@suse.de + +- update 3_5_BRANCH.diff (random bug fixes) +- update kickoff.diff + +------------------------------------------------------------------- +Wed Sep 27 16:34:49 CEST 2006 - stbinner@suse.de + +- add recommendation to kdebase3-beagle for kdebase3 package + +------------------------------------------------------------------- +Thu Sep 21 19:02:39 CEST 2006 - dmueller@suse.de + +- preliminary viewport pager support +- update compmgr patch to remove opacity slider when no extension + is applicable + +------------------------------------------------------------------- +Thu Sep 21 09:53:40 CEST 2006 - stbinner@suse.de + +- fix build +- kcheckpass-pam, kdm-pam-np: remove pam_devperm.so (Bug #206963) + +------------------------------------------------------------------- +Tue Sep 19 22:58:28 CEST 2006 - dmueller@suse.de + +- use sudo for kdesu + +------------------------------------------------------------------- +Tue Sep 19 09:56:02 CEST 2006 - coolo@suse.de + +- disable low disk space warning for < 10.1 + +------------------------------------------------------------------- +Tue Sep 19 00:40:04 CEST 2006 - dmueller@suse.de + +- update kickoff patch to include numerous bugfixes + +------------------------------------------------------------------- +Mon Sep 18 13:56:22 CEST 2006 - ltinkl@suse.cz + +- fixing low disk space warning dialog (the don't-show-again case) + +------------------------------------------------------------------- +Thu Sep 14 21:31:44 CEST 2006 - coolo@suse.de + +- fixing low disk space calculation for huge volumes (without having + one to test either) + +------------------------------------------------------------------- +Thu Sep 14 09:16:23 CEST 2006 - coolo@suse.de + +- actually check the auth in kcheckpass + +------------------------------------------------------------------- +Tue Sep 12 20:59:30 CEST 2006 - dmueller@suse.de + +- update 3_5_BRANCH to fix kicker hang (#204728) + +------------------------------------------------------------------- +Tue Sep 12 15:28:07 CEST 2006 - stbinner@suse.de + +- update kickoff patch and package plugin to kdebase3-beagle +- add "bnc" web shortcut for Novell Bugzilla (#204724) + +------------------------------------------------------------------- +Tue Sep 12 15:13:17 CEST 2006 - ltinkl@suse.cz + +- implement #199054 - Add low disk space real time monitor + +------------------------------------------------------------------- +Thu Sep 7 16:52:33 CEST 2006 - dmueller@suse.de + +- make kompmr optional + +------------------------------------------------------------------- +Thu Sep 7 12:03:49 CEST 2006 - coolo@suse.de + +- split pam config between xdm and kcheckpass (#133347) + +------------------------------------------------------------------- +Thu Sep 7 09:24:18 CEST 2006 - coolo@suse.de + +- recommend gdb +- update kickoff patch to have larger back button +- update 3_5_BRANCH.diff (random bug fixes) +- back out the konsole bold font change for now (kde #131770) + +------------------------------------------------------------------- +Tue Sep 5 10:00:14 CEST 2006 - stbinner@suse.de + +- correcting kdm patches for older distributions + +------------------------------------------------------------------- +Mon Sep 4 14:48:46 CEST 2006 - llunak@suse.cz + +- Add patches with Xinerama improvements + +------------------------------------------------------------------- +Sun Sep 3 08:59:45 CEST 2006 - stbinner@suse.de + +- fix build on older distributions + +------------------------------------------------------------------- +Fri Sep 1 14:52:22 CEST 2006 - coolo@suse.de + +- fixed layout of the back button +- updated to 3_5_BRANCH to fix kwin alt-tab ugliness +- move kdmrc out of /etc/opt/kde3 if found an old one in /opt/kde3 + +------------------------------------------------------------------- +Fri Sep 1 07:29:42 CEST 2006 - coolo@suse.de + +- adding SUSE menu + +------------------------------------------------------------------- +Thu Aug 31 13:56:43 CEST 2006 - stbinner@suse.de + +- add man pages for fileshareset and kcheckpass (#187356) + +------------------------------------------------------------------- +Mon Aug 28 13:30:59 CEST 2006 - stbinner@suse.de + +- switch lock and logout order in Kicker lock/logout applet + +------------------------------------------------------------------- +Fri Aug 25 21:34:59 CEST 2006 - coolo@suse.de + +- fixing the order where it matters + +------------------------------------------------------------------- +Fri Aug 25 14:36:30 CEST 2006 - coolo@suse.de + +- fix more default values for kdmrc + +------------------------------------------------------------------- +Wed Aug 23 17:46:14 CEST 2006 - coolo@suse.de + +- rework the way kdmrc is handled (rather experimental): + - the KDE defaults are changed right in the build where the value + is static (kdm-fix-default-kdmrc.diff) + - the KDE kdmrc is the one used by kdm and kcontrol + - the default values are overwritten by values in + (/var/adm/kdm/kdmrc.syscnfig generated by kdm_config) + - Fixes #163954 + - drops a SuSEconfig + +------------------------------------------------------------------- +Wed Aug 23 11:01:33 CEST 2006 - stbinner@suse.de + +- update 3_5_BRANCH.diff (mostly Konqueror, Kicker and Kwin fixes) + +------------------------------------------------------------------- +Thu Aug 17 14:31:25 CEST 2006 - dmueller@suse.de + +- add SuSEconfig.kdm3 script from the theme flavour package + (#181572) + +------------------------------------------------------------------- +Thu Aug 3 17:45:35 CEST 2006 - stbinner@suse.de + +- adapt to new X.org paths + +------------------------------------------------------------------- +Sun Jul 23 21:49:02 CEST 2006 - coolo@suse.de + +- update to KDE 3.5.4: + * support X-KDE-Protocols in konqi RMB menu + * several Kate fixes + * Konsole: miscellanous speedups and bug fixes + * media manager: several fixes and HAL support merged upstream + * security: add various missing return value checks + +------------------------------------------------------------------- +Sun Jul 9 20:50:29 CEST 2006 - stbinner@suse.de + +- fix "kdeeject --help" (#190836) + +------------------------------------------------------------------- +Sat Jun 24 21:44:58 CEST 2006 - schwab@suse.de + +- Use long long for parsing net stats to support more than 4G. + +------------------------------------------------------------------- +Wed Jun 21 18:44:29 CEST 2006 - stbinner@suse.de + +- update branch diff and media-iPod.diff to fix iPod support + +------------------------------------------------------------------- +Mon Jun 19 21:24:08 CEST 2006 - stbinner@suse.de + +- fix build + +------------------------------------------------------------------- +Mon Jun 19 15:34:16 CEST 2006 - coolo@suse.de + +- update 3_5_BRANCH.diff again for several bug fixes (KDE bug reports + 47242 128754 117623 116209 55795) + +------------------------------------------------------------------- +Mon Jun 19 08:21:22 CEST 2006 - coolo@suse.de + +- don't translate hidden uninstall.desktop files + +------------------------------------------------------------------- +Fri Jun 16 12:41:47 CEST 2006 - coolo@suse.de + +- use sax.mo for translating xkb options (#183672) + +------------------------------------------------------------------- +Wed Jun 14 16:56:43 CEST 2006 - coolo@suse.de + +- update 3_5_BRANCH.diff and media_suse.diff to follow the upstream + merge of our media:/ changes + +------------------------------------------------------------------- +Mon Jun 12 17:11:03 CEST 2006 - dmueller@suse.de + +- fix ~/.dmrc symlink attack (#180704, CVE-2006-2449) + +------------------------------------------------------------------- +Mon Jun 12 15:19:14 CEST 2006 - stbinner@suse.de + +- update 3_5_BRANCH.diff to fix build (OpenEXR configure check) +- obey chosen k menu item format when collapsing menus (#183244) + +------------------------------------------------------------------- +Tue Jun 6 22:03:45 CEST 2006 - stbinner@suse.de + +- add 3_5_BRANCH.diff to fix screensaver not starting (#181122) + +------------------------------------------------------------------- +Tue May 30 17:06:14 CEST 2006 - stbinner@suse.de + +- don't enforce sorting of menu entries (#160259) + +------------------------------------------------------------------- +Fri May 26 17:18:32 CEST 2006 - stbinner@suse.de + +- new KDE 3.5.3 tarball (fix systram-tray related Kicker crashes) + +------------------------------------------------------------------- +Wed May 24 09:56:43 CEST 2006 - stbinner@suse.de + +- update to KDE 3.5.3 + * KDE startup reordered in order to improve startup time + * several fixes to Kicker, Konsole, Kate, Konqueror and kwin + +------------------------------------------------------------------- +Tue May 23 17:14:56 CEST 2006 - adrian@suse.de + +- fix build for the openSUSE build service + +------------------------------------------------------------------- +Fri May 19 10:15:30 CEST 2006 - stbinner@suse.de + +- fix supplementary build + +------------------------------------------------------------------- +Mon May 15 17:14:14 CEST 2006 - stbinner@suse.de + +- update to KDE 3.5.2 and 3_5_BRANCH.diff + * Klipper + - Handle URLs as URLs and not as Text (bug #121114) + - Prevent crashes caused by corrupted history (bug #109161) + - XFixes support (especially helps with broken clipboard + implementations of some non-KDE applications) (bug #101087) + - Images are ignored by default, add 'IgnoreImages=false' to + '[General]' in klipperrc (bug #109032) + - Avoid repeated action popup with the same URL with some + non-KDE applications with broken clipboard implementations + * Konsole + - Correct issue where history size is unlimited when dealing + with History options in profiles (bug #120046) + - Correctly set Tab bar when set to Dynamic Hide after + session restore (bug #121688) + * Country settings + - Fix short date format for Switzerland (bug #122574) + - Fix address format (especially P.O. Box) for Switzerland + * KSysGuard + - Show the sensors with values of more than two digits + correctly in the applet + * Kicker + - Connect the applications to systray correctly on startup + - Panels properly reserve space at screen edges even for + differently sized Xinerama screens (bug #94470) + * Konqueror + - Resolve symlinks only on the desktop (bug #63014) + * KWin + - Added new window-specific rules for OpenOffice.org, XV and + Mozilla family applications for turning off focus stealing + prevention, as these applications don't work well with it + - Reverted a workaround that as a side-effect had broken + systray docking of some applications (bug #100177) + - Each virtual desktop has a separate focus chain (bug #33701) + * KDesktop + - Fixed stacking of some dialogs (bug #89951,bug #113556) +------------------------------------------------------------------- +Wed May 10 16:19:01 CEST 2006 - coolo@suse.de + +- line break if the message is too long for the screen (#157237) + +------------------------------------------------------------------- +Tue Apr 25 19:22:06 CEST 2006 - wstephenson@suse.de + +- Use a user writable directory for user indexing (#165308) + +------------------------------------------------------------------- +Mon Apr 24 13:24:18 CEST 2006 - stbinner@suse.de + +- pull libXt into plugin scan to find all NS plugins (#140485) + +------------------------------------------------------------------- +Fri Apr 21 17:04:13 CEST 2006 - stbinner@suse.de + +- don't show errors in kcm_kio without kdenetwork3-lan (#165318) + +------------------------------------------------------------------- +Mon Apr 17 18:07:32 CEST 2006 - ltinkl@suse.cz + +- fix "KDE Information Center fails to provide log info for samba" + (#98763) + +------------------------------------------------------------------- +Tue Apr 11 10:48:45 CEST 2006 - coolo@suse.de + +- update media_hal.diff to make mounting floppies work (#164488) + +------------------------------------------------------------------- +Mon Apr 10 13:22:01 CEST 2006 - wstephenson@suse.de + +- Fix failure to open Sound kcmodule (#164768) + +------------------------------------------------------------------- +Sat Apr 8 21:25:25 CEST 2006 - schwab@suse.de + +- Fix misplaced %endif [#58820]. + +------------------------------------------------------------------- +Wed Apr 5 12:19:14 CEST 2006 - dmueller@suse.de + +- update hinting default to full (#157441) + +------------------------------------------------------------------- +Mon Apr 3 19:00:25 CEST 2006 - stbinner@suse.de + +- fix possible Konsole crash on session saving/logout (#147286) + +------------------------------------------------------------------- +Mon Apr 3 14:34:35 CEST 2006 - stbinner@suse.de + +- don't remove obsolete from list of known kdesu options (#162790) +- fix panel configuration to not always ask to save (#157821) +- add missing kdm Provides: for transition from NLD9 (#162511) + +------------------------------------------------------------------- +Fri Mar 31 17:24:26 CEST 2006 - stbinner@suse.de + +- update media_hal.diff to make it possible that applications like + k3b can stop automounting (#160654) + +------------------------------------------------------------------- +Tue Mar 28 17:46:23 CEST 2006 - coolo@suse.de + +- update media_hal.diff to handle fstab entries more correctly + +------------------------------------------------------------------- +Thu Mar 23 10:34:38 CET 2006 - stbinner@suse.de + +- add patch to fix jumpy taskbar size (#156621) +- update media_hal.diff to fix setting of mount properties for a + removable device (#160002) and respect hal lockdown (#153241) +- fix kded application launch hang due to NFS (#160292) + +------------------------------------------------------------------- +Tue Mar 21 11:14:57 CET 2006 - stbinner@suse.de + +- make kdeeject work again (#159310) + +------------------------------------------------------------------- +Mon Mar 20 10:52:45 CET 2006 - stbinner@suse.de + +- remove "Keep password" checkbox from kdesu (#159224) + +------------------------------------------------------------------- +Sat Mar 18 22:26:30 CET 2006 - coolo@suse.de + +- update kicker to more changes to fix crashes on logout + (#155339) + +------------------------------------------------------------------- +Thu Mar 16 18:01:05 CET 2006 - dmueller@suse.de + +- fix klipper actions listing firefox twice +- fix klipper not linking against Xfixes +- fix klipper handling urls as plain text (KDE #121114) +- fix Xfixes detection + +------------------------------------------------------------------- +Mon Mar 13 19:00:07 CET 2006 - wstephenson@suse.de + +- make offline mode for accessible for konqueror + +------------------------------------------------------------------- +Mon Mar 13 15:13:11 CET 2006 - stbinner@suse.de + +- allow to hide wallpapers from configuration (#156170) +- install startkde.suse.sh only for older distributions + +------------------------------------------------------------------- +Sat Mar 11 14:36:23 CET 2006 - coolo@suse.de + +- hide kjobviewer startup info on quit (#156821) + +------------------------------------------------------------------- +Thu Mar 9 13:02:33 CET 2006 - coolo@suse.de + +- update kicker to latest changes to fix crashes on logout (#155339, + http://bugs.kde.org/121430) + +------------------------------------------------------------------- +Wed Mar 8 08:39:40 CET 2006 - dmueller@suse.de + +- fix permissions of README (#155946) +- make KDM_SHUTDOWN sysconfig migration complete + +------------------------------------------------------------------- +Tue Mar 7 10:59:00 CET 2006 - stbinner@suse.de + +- update media_hal.diff to fix mounting (#154652) +- give mini cli dialog parent to fix #155355 +- add %post for 10.1 to migrate KDM_SHUTDOWN (#148468) +- don't try to grep non-existing file in kdm %post (#154302) +- don't try to run artsshell on shutdown if not installed +- let kdm ignore unresolvable hosts in Xaccess (#135714) + +------------------------------------------------------------------- +Mon Mar 6 16:17:13 CET 2006 - dmueller@suse.de + +- Add XV to focus-stealing-prevention blacklist (#155250) + +------------------------------------------------------------------- +Mon Mar 6 08:23:40 CET 2006 - hpj@suse.de + +- Use susehelp to show docs. This enables preprocessing that + allows khelpcenter to show GNOME documentation. + +------------------------------------------------------------------- +Wed Mar 1 19:32:30 CET 2006 - stbinner@suse.de + +- unbreak Kicker menus when user-arranged (#151492) + +------------------------------------------------------------------- +Tue Feb 28 10:38:04 CET 2006 - stbinner@suse.de + +- no "Recommends:" for older distributions + +------------------------------------------------------------------- +Mon Feb 27 16:05:35 CET 2006 - coolo@suse.de + +- more files to translate (#144788) + +------------------------------------------------------------------- +Mon Feb 27 10:51:56 CET 2006 - coolo@suse.de + +- only use preload if it's the 10.1 version (#153543) + +------------------------------------------------------------------- +Fri Feb 24 21:36:02 CET 2006 - ltinkl@suse.cz + +- fix keyboard navigation in Theme Manager (#148299) + +------------------------------------------------------------------- +Tue Feb 21 16:17:23 CET 2006 - dmueller@suse.de + +- downgrade kdelibs3_doc require to recommends (#152504) + +------------------------------------------------------------------- +Mon Feb 20 19:14:40 CET 2006 - dmueller@suse.de + +- fix ksysguard killing hidden processes (#151804) + +------------------------------------------------------------------- +Fri Feb 17 14:25:10 CET 2006 - dmueller@suse.de + +- remove spec file sections for SL < 9.2 + +------------------------------------------------------------------- +Fri Feb 17 11:11:30 CET 2006 - coolo@suse.de + +- fix crash in HAL backend on stick removal (#151742) + +------------------------------------------------------------------- +Thu Feb 16 10:14:26 CET 2006 - dmueller@suse.de + +- add $HOME/.gtkrc-2.0 to GTK2_RC_FILES (#151344) + +------------------------------------------------------------------- +Wed Feb 15 16:57:42 CET 2006 - coolo@suse.de + +- update media_hal.diff to fix unmount (#149472) + +------------------------------------------------------------------- +Wed Feb 15 09:06:39 CET 2006 - stbinner@suse.de + +- fix %suse_update_desktop_file parameter order +- add intermediate kdebase3-khotkeys package to provides/obsoletes + +------------------------------------------------------------------- +Tue Feb 14 15:17:10 CET 2006 - llunak@suse.cz + +- discard old ksycoca during startup if rpm database has changed +- fix showing menu entries in short-menus.diff +- khelpcenter indexing fixes (#146618) + +------------------------------------------------------------------- +Fri Feb 10 11:45:40 CET 2006 - stbinner@suse.de + +- disable kwin focus stealing prevention for Mozilla family apps + and OpenOffice.org by default (#115417) + +------------------------------------------------------------------- +Thu Feb 9 11:55:34 CET 2006 - coolo@suse.de + +- adapt to new way of preload (#147673) + +------------------------------------------------------------------- +Wed Feb 8 15:53:05 CET 2006 - coolo@suse.de + +- reinit pam sessions as the pam handle stores user specific data + (#144804) + +------------------------------------------------------------------- +Tue Feb 7 13:46:57 CET 2006 - stbinner@suse.de + +- add "most common nsplugin crash" fix (KDE #121501) +- fix Konsole history saving being incomplete (KDE #116351) + +------------------------------------------------------------------- +Mon Feb 6 12:01:33 CET 2006 - dmueller@suse.de + +- move khotkeys-arts to kdebase3-extra +- rediff media_hal.diff to fix crash on logout + +------------------------------------------------------------------- +Mon Feb 6 01:35:13 CET 2006 - ro@suse.de + +- fix build for < 10.1 + +------------------------------------------------------------------- +Fri Feb 3 16:16:50 CET 2006 - coolo@suse.de + +- fix kicker menu extension (#147941) + +------------------------------------------------------------------- +Fri Feb 3 12:14:37 CET 2006 - coolo@suse.de + +- add patches to KDE SVN done by SUSE engineers +- add patch to fix severe problem with keyboard chooser (KDE #121087) + +------------------------------------------------------------------- +Fri Feb 3 12:08:33 CET 2006 - coolo@suse.de + +- Fix #74524 and merge kicker-fix-alphabetical into short-menus + (by Lubos) + +------------------------------------------------------------------- +Thu Feb 2 19:19:29 CET 2006 - coolo@suse.de + +- updating media patch as we fixed problems + +------------------------------------------------------------------- +Thu Feb 2 14:58:35 CET 2006 - coolo@suse.de + +- remove logrotate script (#144544) + +------------------------------------------------------------------- +Wed Feb 1 16:50:16 CET 2006 - dmueller@suse.de + +- fix kicker crashes caused by kicker-fix-alphabetical.diff +- add xfixes support to klipper + +------------------------------------------------------------------- +Wed Feb 1 16:15:19 CET 2006 - coolo@suse.de + +- fix wallpapers path + +------------------------------------------------------------------- +Mon Jan 30 18:22:25 CET 2006 - coolo@suse.de + +- make xdm pam service future proof (suggestion by kukuk) + +------------------------------------------------------------------- +Mon Jan 30 14:27:19 CET 2006 - stbinner@suse.de + +- update media_hal.diff +- drop workaround-xterm-size-bug.diff + +------------------------------------------------------------------- +Mon Jan 30 11:44:06 CET 2006 - stbinner@suse.de + +- update to 3.5 branch + +------------------------------------------------------------------- +Sun Jan 29 22:19:40 CET 2006 - coolo@suse.de + +- fix build + +------------------------------------------------------------------- +Sun Jan 29 15:21:26 CET 2006 - aj@suse.de + +- Require dbus-1-qt3-devel for build. + +------------------------------------------------------------------- +Sat Jan 28 16:08:11 CET 2006 - coolo@suse.de + +- fix kdm colors + +------------------------------------------------------------------- +Sat Jan 28 15:17:06 CET 2006 - coolo@suse.de + +- move wallpapers to /usr/share/wallpapers + +------------------------------------------------------------------- +Fri Jan 27 18:09:47 CET 2006 - coolo@suse.de + +- fix two media handling bugs + +------------------------------------------------------------------- +Fri Jan 27 11:33:35 CET 2006 - coolo@suse.de + +- samba maintainers changed their mind + +------------------------------------------------------------------- +Wed Jan 25 22:00:05 CET 2006 - coolo@suse.de + +- update to 3.5 branch for smb integration fix +- add Lubos' splash screen improvment patch +- update media handling patch +- add patch to support old plugger features + +------------------------------------------------------------------- +Wed Jan 25 21:33:03 CET 2006 - mls@suse.de + +- converted neededforbuild to BuildRequires + +------------------------------------------------------------------- +Mon Jan 23 22:36:31 CET 2006 - coolo@suse.de + +- wrote mount plugin for subfs replacement + +------------------------------------------------------------------- +Mon Jan 23 18:15:28 CET 2006 - stbinner@suse.de + +- fix alphabetic sorting of start menu entries (#143351) + +------------------------------------------------------------------- +Mon Jan 23 16:08:22 CET 2006 - coolo@suse.de + +- translate some more files + +------------------------------------------------------------------- +Sun Jan 22 13:34:23 CET 2006 - stbinner@suse.de + +- fix Bug 117636 - No printer entry in the control center + +------------------------------------------------------------------- +Sat Jan 21 20:25:30 CET 2006 - coolo@suse.de + +- update to KDE 3.5.1 +- use HAL in media:/ instead of subfs + +------------------------------------------------------------------- +Mon Jan 16 17:28:44 CET 2006 - wstephenson@suse.de + +- Add KHelpCenter rellinks support +- Don't prompt the user to create indices, now automatic. + +------------------------------------------------------------------- +Thu Jan 12 16:16:47 CET 2006 - stbinner@suse.de + +- Rename "Control Center" to "Personal Settings" +- Have "My System" and "Recent Documents" by default in kmenu + +------------------------------------------------------------------- +Tue Jan 10 09:08:57 CET 2006 - coolo@suse.de + +- adding a domain-label to kdm themes + +------------------------------------------------------------------- +Mon Jan 9 12:26:27 CET 2006 - stbinner@suse.de + +- update to 3_5_BRANCH +- disable kxkb_variants_3_5.diff (same functionality upstream) +- remove khotkeys.patch (committed upstream) + +------------------------------------------------------------------- +Sat Jan 7 22:55:24 CET 2006 - stbinner@suse.de + +- update to 3_5_BRANCH.diff before the first Beta + +------------------------------------------------------------------- +Thu Jan 5 15:17:51 CET 2006 - llunak@suse.cz + +- update performance patch, use same names like in kdebase-SuSE +- less verbal kdesu prompt (feature #4135) + +------------------------------------------------------------------- +Mon Jan 2 13:56:48 CET 2006 - ltinkl@suse.cz + +- fix KDE screen lock missing language switcher (#133244) + +------------------------------------------------------------------- +Fri Dec 23 11:41:01 CET 2005 - stbinner@suse.de + +- updated 3_5_BRANCH.diff (kdm winbind greeter etc.) +- updated kdm-make_it_cool.diff + +------------------------------------------------------------------- +Wed Dec 21 13:18:25 CET 2005 - stbinner@suse.de + +- fix build for released distributions + +------------------------------------------------------------------- +Mon Dec 19 11:58:53 CET 2005 - dmueller@suse.de + +- use dbus-1-qt3 + +------------------------------------------------------------------- +Wed Dec 14 14:04:32 CET 2005 - lmuelle@suse.de + +- Package fileshareset and filesharelist as a separate package named fileshare + for post 10.0 products and use %_bindir as install location. + +------------------------------------------------------------------- +Sun Dec 4 23:53:06 CET 2005 - lmuelle@suse.de + +- Revert libsmbclient renameing. + +------------------------------------------------------------------- +Fri Dec 2 11:38:19 CET 2005 - coolo@suse.de + +- update to 3.5 branch and adapt the patches accordingly +- add two more patches of Lubos + +------------------------------------------------------------------- +Tue Nov 29 14:17:40 CET 2005 - coolo@suse.de + +- uncommenting kxkb patch +- remove support for outdated suse versions +- remove the khotkeys package for now + +------------------------------------------------------------------- +Mon Nov 28 13:26:02 CET 2005 - ltinkl@suse.cz + +- update kxkb to fix KDE bug #116619 + +------------------------------------------------------------------- +Sun Nov 27 18:09:08 CET 2005 - coolo@suse.de + +- fix patch conflict + +------------------------------------------------------------------- +Sat Nov 26 10:09:51 CET 2005 - coolo@suse.de + +- update to version 3.5 + +------------------------------------------------------------------- +Fri Nov 25 11:47:09 CET 2005 - stbinner@suse.de + +- fix initial kmenu pos and last/most used section losing icons + +------------------------------------------------------------------- +Wed Nov 23 20:37:54 CET 2005 - coolo@suse.de + +- fix repainting + +------------------------------------------------------------------- +Tue Nov 22 21:52:24 CET 2005 - coolo@suse.de + +- add tooltips to the buttons as suggested by Eva + +------------------------------------------------------------------- +Mon Nov 21 15:25:27 CET 2005 - stbinner@suse.de + +- update to version 3.5 RC 2 + +------------------------------------------------------------------- +Mon Nov 21 11:12:28 CET 2005 - dmueller@suse.de + +- remove xorg-x11 dependency for SL < 9.2 + +------------------------------------------------------------------- +Fri Nov 18 08:45:51 CET 2005 - stbinner@suse.de + +- fix build after last patch on older distributions + +------------------------------------------------------------------- +Thu Nov 17 16:24:55 CET 2005 - stbinner@suse.de + +- fix kmenu search freezing computer for some seconds (#133593) + +------------------------------------------------------------------- +Mon Nov 14 22:41:14 CET 2005 - lmuelle@suse.de + +- Use samba-libs instead of libsmbclient. + +------------------------------------------------------------------- +Thu Nov 10 12:03:25 CET 2005 - stbinner@suse.de + +- update to version 3.5 RC 1 + +------------------------------------------------------------------- +Sat Nov 5 00:33:54 CET 2005 - coolo@suse.de + +- add patches to improve startup performance + +------------------------------------------------------------------- +Thu Nov 3 10:54:17 CET 2005 - coolo@suse.de + +- fix suseplugger integration to not create fork bombs + +------------------------------------------------------------------- +Mon Oct 31 11:50:24 CET 2005 - coolo@suse.de + +- update kdm patches + +------------------------------------------------------------------- +Mon Oct 31 09:43:52 CET 2005 - coolo@suse.de + +- update to 3.5 branch +- call suseplugger for unhandled UDIs + +------------------------------------------------------------------- +Thu Oct 20 13:43:18 CEST 2005 - ltinkl@suse.cz + +- update kstartupconfig for KDE 3.5 (from Seli) +- fixed window decorations messed up with maximized windows (#120027) +- implemented support for configuring multiple keyboard variants in kxkb (#120395) + +------------------------------------------------------------------- +Wed Oct 19 13:48:43 CEST 2005 - stbinner@suse.de + +- readd still needed parts of improve-panelservicemenu-geticonset.diff + +------------------------------------------------------------------- +Thu Oct 13 16:41:08 CEST 2005 - dmueller@suse.de + +- fix build +- disable accessibility feature if kdeaccessibility is not installed + +------------------------------------------------------------------- +Wed Oct 12 13:34:12 CEST 2005 - stbinner@suse.de + +- update to version 3.4.92 (3.5 Beta 2) + +------------------------------------------------------------------- +Tue Oct 11 21:11:14 CEST 2005 - stbinner@suse.de + +- add patch to teach mini-CLI the "lock" command + +------------------------------------------------------------------- +Fri Oct 7 17:56:00 CEST 2005 - coolo@suse.de + +- update to 3.5 branch to get some testing for media:/ changes + +------------------------------------------------------------------- +Sun Oct 2 10:22:57 CEST 2005 - stbinner@suse.de + +- in collapsed k menu group use category icon if entry has none + +------------------------------------------------------------------- +Fri Sep 30 17:45:12 CEST 2005 - stbinner@suse.de + +- fix wrongly upgraded patch (short-menus.diff) + +------------------------------------------------------------------- +Thu Sep 29 11:06:07 CEST 2005 - stbinner@suse.de + +- remove gdm support from kdmlib for 9.3-x86_64 to fix compilation + +------------------------------------------------------------------- +Wed Sep 28 18:36:49 CEST 2005 - stbinner@suse.de + +- never show broken looking icons in kicker start menu +- show nice disabled icons for smaller kicker menu icon sizes + +------------------------------------------------------------------- +Mon Sep 26 14:12:46 CEST 2005 - stbinner@suse.de + +- fix compilation on 9.2-x86_64, don't use Xfixes + +------------------------------------------------------------------- +Mon Sep 26 13:03:24 CEST 2005 - dmueller@suse.de + +- add 3_5_BRANCH.diff and try to fix fileconflicts + +------------------------------------------------------------------- +Mon Sep 26 09:32:45 CEST 2005 - coolo@suse.de + +- updating info about lame as given by legal + +------------------------------------------------------------------- +Sat Sep 24 16:08:27 CEST 2005 - stbinner@suse.de + +- fix dependencies of khotkeys package for <10.0 + +------------------------------------------------------------------- +Tue Sep 20 18:29:49 CEST 2005 - stbinner@suse.de + +- update to version 3.4.91 (3.5 Beta) + +------------------------------------------------------------------- +Wed Sep 14 22:54:52 CEST 2005 - dmueller@suse.de + +- fix kicker crashing on logout (#117100) + +------------------------------------------------------------------- +Wed Sep 14 08:46:39 CEST 2005 - dmueller@suse.de + +- drop kdelibs3-devel-doc dependendy + +------------------------------------------------------------------- +Fri Sep 9 10:46:20 CEST 2005 - coolo@suse.de + +- fix grubonce support (#106037) + +------------------------------------------------------------------- +Thu Sep 8 13:47:18 CEST 2005 - dmueller@suse.de + +- fix for theme-resetting from Lubos (#114951) + +------------------------------------------------------------------- +Wed Sep 7 20:05:46 CEST 2005 - dmueller@suse.de + +- fix deletion of folders via media:/ (#113583) + +------------------------------------------------------------------- +Tue Sep 6 21:58:30 CEST 2005 - dmueller@suse.de + +- add patch to smb:// to support kerberos authentication (#115245) + +------------------------------------------------------------------- +Tue Sep 6 21:37:46 CEST 2005 - coolo@suse.de + +- let the other init scripts do some IO too, so they don't run + into timeouts + +------------------------------------------------------------------- +Tue Sep 6 15:43:24 CEST 2005 - stbinner@suse.de + +- Fix quick launcher duplicating moved items (#113879) + +------------------------------------------------------------------- +Tue Sep 6 13:31:23 CEST 2005 - coolo@suse.de + +- be a bit more careful with disabling unmount for media (#80313) + +------------------------------------------------------------------- +Mon Sep 5 10:20:37 CEST 2005 - dmueller@suse.de + +- apply fixes for kcheckpass (CAN-2005-2494, #66218) + +------------------------------------------------------------------- +Mon Aug 29 16:03:09 CEST 2005 - coolo@suse.de + +- work around the xterm sizing bug again as we did on 9.2 (#61153) + +------------------------------------------------------------------- +Thu Aug 25 18:11:47 CEST 2005 - coolo@suse.de + +- fixing the screensaver picking + +------------------------------------------------------------------- +Tue Aug 23 17:52:58 CEST 2005 - coolo@suse.de + +- use better defaults for random screensaver +- use the new preload + +------------------------------------------------------------------- +Mon Aug 22 17:24:30 CEST 2005 - llunak@suse.cz + +- Use --embed-proxy instead of --embed for kcmshell with kcmyast, + so that there are no kcmshell buttons with embedded yast. + +------------------------------------------------------------------- +Mon Aug 22 16:16:04 CEST 2005 - llunak@suse.cz + +- Don't start kaccess unconditionally. + +------------------------------------------------------------------- +Mon Aug 22 15:24:42 CEST 2005 - ro@suse.de + +- fixed file list + +------------------------------------------------------------------- +Mon Aug 22 11:25:34 CEST 2005 - coolo@suse.de + +- fix file conflict + +------------------------------------------------------------------- +Sun Aug 21 16:22:30 CEST 2005 - coolo@suse.de + +- fix the kdm change for incomplete themes + +------------------------------------------------------------------- +Sat Aug 20 18:21:45 CEST 2005 - coolo@suse.de + +- trying to please Rudi's impatience (again saving + share holder value) +- some icons massage + +------------------------------------------------------------------- +Fri Aug 19 21:03:12 CEST 2005 - coolo@suse.de + +- update to 3.4 branch +- trying to fix floppy support + +------------------------------------------------------------------- +Thu Aug 18 14:03:25 CEST 2005 - coolo@suse.de + +- kdm sets config variable for xauth (#98627) + +------------------------------------------------------------------- +Tue Aug 16 10:28:44 CEST 2005 - coolo@suse.de + +- let kdm search in the global path even without SUSE theming + +------------------------------------------------------------------- +Mon Aug 15 10:36:49 CEST 2005 - coolo@suse.de + +- update for kdm's not themed user list (#95862) + +------------------------------------------------------------------- +Fri Aug 12 18:34:57 CEST 2005 - dmueller@suse.de + +- add dependency on xorg-x11 (bug #81848) + +------------------------------------------------------------------- +Thu Aug 11 16:39:47 CEST 2005 - llunak@suse.cz + +- Fix the k-menu search patch. + +------------------------------------------------------------------- +Thu Aug 11 12:26:51 CEST 2005 - werner@suse.de + +- Add /home to the nfs check of earlykdm (bug #104052) + +------------------------------------------------------------------- +Wed Aug 10 21:06:50 CEST 2005 - coolo@suse.de + +- update for the media slave (#102564) + +------------------------------------------------------------------- +Tue Aug 9 16:12:27 CEST 2005 - llunak@suse.cz + +- Don't show flags only in the language control module, + otherwise enable them again. + +------------------------------------------------------------------- +Fri Aug 5 11:44:44 CEST 2005 - coolo@suse.de + +- fix kdm to follow the aspect ratio of logos and dots +- some proofreadings + +------------------------------------------------------------------- +Wed Jul 27 11:09:50 CEST 2005 - coolo@suse.de + +- redone kdm patches + +------------------------------------------------------------------- +Tue Jul 26 13:13:09 CEST 2005 - coolo@suse.de + +- new patch for new powersave API + +------------------------------------------------------------------- +Fri Jul 22 14:24:23 CEST 2005 - coolo@suse.de + +- update to version 3.4.2 + +------------------------------------------------------------------- +Tue Jul 19 17:28:14 CEST 2005 - coolo@suse.de + +- Use double-buffered visual also for the screensaver kcm module + (#96605) + +------------------------------------------------------------------- +Sat Jul 16 13:55:53 CEST 2005 - dmueller@suse.de + +- fix typo in -fpie patch + +------------------------------------------------------------------- +Fri Jul 15 14:12:39 CEST 2005 - dmueller@suse.de + +- compile kcheckpass with -fPIE/pie for SL > 9.3 +- compile kdesud with -fpie/pie as well. + +------------------------------------------------------------------- +Wed Jul 6 02:50:35 CEST 2005 - dmueller@suse.de + +- add buffer overflow fix for genkdmconf + +------------------------------------------------------------------- +Fri Jun 24 16:22:46 CEST 2005 - coolo@suse.de + +- fix GL xscreensavers + +------------------------------------------------------------------- +Tue Jun 14 09:38:38 CEST 2005 - coolo@suse.de + +- fix build + +------------------------------------------------------------------- +Mon Jun 13 16:40:15 CEST 2005 - coolo@suse.de + +- another update for kdm + +------------------------------------------------------------------- +Tue Jun 7 14:42:12 CEST 2005 - coolo@suse.de + +- update to 3.4 branch, kdm to 3.5 branch +- add my chances to kdm for more advanced user list + +------------------------------------------------------------------- +Mon Jun 6 10:51:03 CEST 2005 - schwab@suse.de + +- Fix completely stupid and embarrassing CD polling code. + +------------------------------------------------------------------- +Thu Jun 2 11:18:34 CEST 2005 - adrian@suse.de + +- apply k-menu search patch from Fred Schaettgen for post 9.3 + +------------------------------------------------------------------- +Tue May 24 14:09:29 CEST 2005 - adrian@suse.de + +- update to version 3.4.1 + +------------------------------------------------------------------- +Mon May 23 11:22:11 CEST 2005 - adrian@suse.de + +- remove flag images for political reasons (#72452) + +------------------------------------------------------------------- +Tue May 17 11:39:40 CEST 2005 - adrian@suse.de + +- remove dummy TESTME enviroment variable + +------------------------------------------------------------------- +Thu Apr 21 14:30:37 CEST 2005 - adrian@suse.de + +- apply patch with experimental HAL 0.5 support from cvs HEAD + +------------------------------------------------------------------- +Thu Apr 14 17:17:06 CEST 2005 - sbrabec@suse.cz + +- Added audiofile-devel to neededforbuild. + +------------------------------------------------------------------- +Wed Apr 13 12:55:17 CEST 2005 - adrian@suse.de + +- update to current 3_4_BRANCH + * contains konqueror crash fix, when compiled with gcc 4 + +------------------------------------------------------------------- +Mon Apr 4 14:05:15 CEST 2005 - adrian@suse.de + +- do not reload kdm in logrotate (#75700) + +------------------------------------------------------------------- +Mon Apr 4 13:58:12 CEST 2005 - adrian@suse.de + +- fix build with gcc 4 + +------------------------------------------------------------------- +Fri Apr 1 15:14:47 CEST 2005 - adrian@suse.de + +- let libkonq use kdemm framework instead of arts for post 9.3 + +------------------------------------------------------------------- +Sun Mar 27 00:51:17 CET 2005 - schwab@suse.de + +- Fix crash in kwin. + +------------------------------------------------------------------- +Wed Mar 23 15:08:59 CET 2005 - coolo@suse.de + +- fix typo (#74357) + +------------------------------------------------------------------- +Tue Mar 22 18:40:00 CET 2005 - adrian@suse.de + +- avoid double entries from non-visible services in konqueror menu + +------------------------------------------------------------------- +Tue Mar 22 17:22:31 CET 2005 - adrian@suse.de + +- fix kicker layout, after adding items (#71831, by Waldo) + +------------------------------------------------------------------- +Tue Mar 22 15:18:13 CET 2005 - adrian@suse.de + +- create .kde and .kde/share with 0700 permissions again +- hide umount option in media slave for subfs systems + +------------------------------------------------------------------- +Mon Mar 21 17:19:42 CET 2005 - adrian@suse.de + +- move old kdmrc configurations away to avoid problems on + login time (#74072) + +------------------------------------------------------------------- +Sat Mar 19 13:52:49 CET 2005 - adrian@suse.de + +- hide menu entries below gnome, since gnome does require KDE + installed currently (#73539) +- move kthememgr icon to main package (#67133) + +------------------------------------------------------------------- +Fri Mar 18 15:09:02 CET 2005 - adrian@suse.de + +- make ksplashx configurable (by Lubos) + +------------------------------------------------------------------- +Wed Mar 16 21:19:42 CET 2005 - adrian@suse.de + +- fix redirection to kio_ipod + +------------------------------------------------------------------- +Wed Mar 16 08:53:11 CET 2005 - adrian@suse.de + +- fix OnlyShowIn typo in kcontrol.desktop (#72029) +- nsplugin fixes from BRANCH +- check for remote autologin users in earlykdm + +------------------------------------------------------------------- +Tue Mar 15 13:32:14 CET 2005 - coolo@suse.de + +- installing dummy flag for tw to apply to china's import + restrictions (#72503 #72452) + +------------------------------------------------------------------- +Mon Mar 14 09:56:27 CET 2005 - adrian@suse.de + +- let klipper ignore selections in firefox (#72352, by Lubos) +- 3_4_BRANCH update + * sftp protocol fix for non latin1 chars +- change earlykdm check for kbd startup (by jw) +- show kcontrol only within KDE +- disable gestures by default, they get enabled again when + kdeaccessibility3 get installed +- earlykdm does wait for resmgr + +------------------------------------------------------------------- +Thu Mar 10 20:38:41 CET 2005 - coolo@suse.de + +- handle ksplashx in kcontrol + +------------------------------------------------------------------- +Wed Mar 9 10:21:51 CET 2005 - adrian@suse.de + +- fix khelpcenter search (#66466 by Cornelius) +- disable firewire kcm module +- use current BRANCH for kwin + +------------------------------------------------------------------- +Tue Mar 8 14:29:41 CET 2005 - adrian@suse.de + +- fix gimp 2.0 icon pixmap name +- fix kcmfontinst issue (waldo, #66858) +- point the user to a possible configured firewall, if kio_smb + does fail + +------------------------------------------------------------------- +Tue Mar 8 10:16:52 CET 2005 - adrian@suse.de + +- add warning about firewall, if no smb shares got found. + +------------------------------------------------------------------- +Mon Mar 7 10:22:21 CET 2005 - coolo@suse.de + +- fix kdm auth (3_4_BRANCH) +- some kdm accessibility fixes +- shutdown ssh-agent and gpg-agent on logout + +------------------------------------------------------------------- +Fri Mar 4 17:29:55 CET 2005 - adrian@suse.de + +- update to version 3.4 final +- fix kio_smb for password protected shares + +------------------------------------------------------------------- +Wed Mar 2 16:37:02 CET 2005 - adrian@suse.de + +- move Requires: kdelibs3_doc from kdelibs3 to kdebase3 + +------------------------------------------------------------------- +Tue Mar 1 10:37:07 CET 2005 - adrian@suse.de + +- change default style from kicker clock, as requested by Ken + +------------------------------------------------------------------- +Mon Feb 28 17:17:57 CET 2005 - coolo@suse.de + +- porting the admin patch to themed greeter +- fix ksysguardd + +------------------------------------------------------------------- +Mon Feb 28 14:13:37 CET 2005 - coolo@suse.de + +- fix the shutdown entry + +------------------------------------------------------------------- +Mon Feb 28 08:01:25 CET 2005 - adrian@suse.de + +- apply fixes from 3_4_BRANCH + * acroread netscape plugin resize fixes + * enable mdns kcontrol module + +------------------------------------------------------------------- +Sat Feb 26 12:18:23 CET 2005 - adrian@suse.de + +- update to 3.4.0 RC 1 + +------------------------------------------------------------------- +Wed Feb 23 15:03:20 CET 2005 - adrian@suse.de + +- move permissions to aaa_base for 9.3 (#66312) +- remove /usr/X11R6/bin/setXF86Config from permissions + +------------------------------------------------------------------- +Wed Feb 23 09:23:02 CET 2005 - adrian@suse.de + +- hide .hidden/.directory in Gnome + +------------------------------------------------------------------- +Tue Feb 22 09:47:57 CET 2005 - adrian@suse.de + +- add Firefox entry to klipper + +------------------------------------------------------------------- +Mon Feb 21 14:56:10 CET 2005 - adrian@suse.de + +- call update93 script, if needed/possible + +------------------------------------------------------------------- +Fri Feb 18 11:54:18 CET 2005 - adrian@suse.de + +- no System icon on the desktop by default anymore + +------------------------------------------------------------------- +Fri Feb 18 10:54:02 CET 2005 - adrian@suse.de + +- update to current cvs + +------------------------------------------------------------------- +Thu Feb 17 15:38:10 CET 2005 - coolo@suse.de + +- reconfigure the clock afer kdesu yast finished + +------------------------------------------------------------------- +Wed Feb 16 21:49:58 CET 2005 - schwab@suse.de + +- Fix splash configuration in startkde. + +------------------------------------------------------------------- +Wed Feb 16 18:40:24 CET 2005 - adrian@suse.de + +- use ipod:/ slave for /media/iPod in kio_media, if this slave + does exist + +------------------------------------------------------------------- +Wed Feb 16 15:46:23 CET 2005 - coolo@suse.de + +- fixing konsole fonts + +------------------------------------------------------------------- +Wed Feb 16 14:33:02 CET 2005 - adrian@suse.de + +- fix menu shorting + +------------------------------------------------------------------- +Mon Feb 14 17:47:37 CET 2005 - adrian@suse.de + +- update from CVS + +------------------------------------------------------------------- +Fri Feb 11 16:18:16 CET 2005 - adrian@suse.de + +- add split provides for session sub package + +------------------------------------------------------------------- +Fri Feb 11 12:54:37 CET 2005 - coolo@suse.de + +- split kde startup link into an extra package to asure people do + not log into incomplete KDE setups because of dependencies + +------------------------------------------------------------------- +Fri Feb 11 10:31:49 CET 2005 - adrian@suse.de + +- update from CVS + +------------------------------------------------------------------- +Thu Feb 10 18:19:08 CET 2005 - adrian@suse.de + +- konsole-use-xft-font patch got obsoleted + +------------------------------------------------------------------- +Thu Feb 10 11:11:08 CET 2005 - adrian@suse.de + +- do not package a static kdmrc anymore, but generate it with genkdmconf + +------------------------------------------------------------------- +Mon Feb 7 11:37:49 CET 2005 - adrian@suse.de + +- update to beta 2 + +------------------------------------------------------------------- +Mon Jan 31 15:24:11 CET 2005 - coolo@suse.de + +- removed tip that is not true on SUSE (#45352) + +------------------------------------------------------------------- +Sat Jan 29 10:36:45 CET 2005 - coolo@suse.de + +- updated the mach_blass patch to do some really fancy stuff + +------------------------------------------------------------------- +Fri Jan 28 15:49:58 CET 2005 - adrian@suse.de + +- update to current snapshot +- add option in kdm/logout dialog to call suspend (coolo) + +------------------------------------------------------------------- +Tue Jan 25 16:47:15 CET 2005 - adrian@suse.de + +- fix export of GTK2_RC_FILES + +------------------------------------------------------------------- +Mon Jan 24 17:22:31 CET 2005 - coolo@suse.de + +- update to current snapshot (new kdm) + +------------------------------------------------------------------- +Fri Jan 21 10:42:16 CET 2005 - adrian@suse.de + +- update to current snapshot +- enable HAL in media slave +- remove update dialog + +------------------------------------------------------------------- +Thu Jan 20 19:22:23 CET 2005 - coolo@suse.de + +- activate earlykdm per default + +------------------------------------------------------------------- +Sat Jan 15 20:54:11 CET 2005 - schwab@suse.de + +- Use <owner>:<group> in permissions file. + +------------------------------------------------------------------- +Thu Jan 13 09:50:09 CET 2005 - coolo@suse.de + +- updated to HEAD +- patched startkde to prefer ksplashx + +------------------------------------------------------------------- +Wed Jan 12 13:34:39 CET 2005 - coolo@suse.de + +- fix order in startkde.suse + +------------------------------------------------------------------- +Mon Jan 10 18:49:24 CET 2005 - coolo@suse.de + +- fix earlykdm init script to use correct return values +- make use of earlysyslog + +------------------------------------------------------------------- +Sun Jan 9 10:01:53 CET 2005 - adrian@suse.de + +- final 3.4 beta 1 + +------------------------------------------------------------------- +Tue Jan 4 16:36:40 CET 2005 - coolo@suse.de + +- update to 3.4 beta 1 (snapshot) +- some work on kdm + +------------------------------------------------------------------- +Fri Dec 17 13:52:19 CET 2004 - coolo@suse.de + +- fixing exec call + +------------------------------------------------------------------- +Wed Dec 15 16:28:14 CET 2004 - coolo@suse.de + +- simplifying script + +------------------------------------------------------------------- +Tue Dec 14 11:46:45 CET 2004 - coolo@suse.de + +- convert fileshareset to automake syntax +- adding early kdm boot script + +------------------------------------------------------------------- +Mon Dec 13 17:32:25 CET 2004 - coolo@suse.de + +- get rid of own copy of startkde and split into suse specific + startup resource and default changing diff + +------------------------------------------------------------------- +Wed Dec 8 13:26:42 CET 2004 - adrian@suse.de + +- update to official 3.4 alpha 1 + +------------------------------------------------------------------- +Fri Dec 3 15:34:28 CET 2004 - adrian@suse.de + +- apply 3_3_BRANCH patch to fix konsole crash + +------------------------------------------------------------------- +Tue Nov 30 09:55:55 CET 2004 - adrian@suse.de + +- run krootimage in background on startup + +------------------------------------------------------------------- +Mon Nov 29 22:52:54 CET 2004 - adrian@suse.de + +- update to version 3.3.2 + +------------------------------------------------------------------- +Tue Nov 23 16:14:32 CET 2004 - adrian@suse.de + +- fix build for older distributions +- clean up startkde script a bit (removing themeing of GTK1 applications) + +------------------------------------------------------------------- +Thu Nov 18 15:46:19 CET 2004 - adrian@suse.de + +- add missing %suse_update_desktop_file calls + +------------------------------------------------------------------- +Thu Nov 18 15:37:21 CET 2004 - ro@suse.de + +- use kerberos-devel-packages + +------------------------------------------------------------------- +Thu Nov 11 22:22:07 CET 2004 - adrian@suse.de + +- add $prefix/env support from KDE startkde script + +------------------------------------------------------------------- +Mon Oct 25 18:33:09 CEST 2004 - adrian@suse.de + +- fix file sharing visibility (#43056) + +------------------------------------------------------------------- +Wed Oct 20 11:26:20 CEST 2004 - uli@suse.de + +- fixed KDM on 64-bit BE systems (bug #47202) + +------------------------------------------------------------------- +Thu Oct 14 17:43:40 CEST 2004 - adrian@suse.de + +- remove kdm-codec patch, it is not needed with the new xdm + script anymore and has a bad effect for chinese people + +------------------------------------------------------------------- +Tue Oct 12 13:11:34 CEST 2004 - adrian@suse.de + +- update to version 3.3.1 + +------------------------------------------------------------------- +Thu Oct 7 13:28:57 CEST 2004 - adrian@suse.de + +- fix file conflict between kdebase3 and kdebase3-extra + +------------------------------------------------------------------- +Tue Oct 5 17:21:05 CEST 2004 - adrian@suse.de + +- update to complete polish translations + +------------------------------------------------------------------- +Tue Oct 5 16:49:00 CEST 2004 - coolo@suse.de + +- updated translations + +------------------------------------------------------------------- +Tue Oct 5 13:31:36 CEST 2004 - adrian@suse.de + +- avoid error message on adding a desktop icon on first login. + (#46713) + +------------------------------------------------------------------- +Mon Oct 4 18:16:31 CEST 2004 - adrian@suse.de + +- fix for view gnome help pages with khelpcenter via help:$application + (by clahey, #45480) + +------------------------------------------------------------------- +Mon Oct 4 14:58:59 CEST 2004 - coolo@suse.de + +- don't show a trans slider by default (#46492) + +------------------------------------------------------------------- +Thu Sep 30 15:06:44 CEST 2004 - adrian@suse.de + +- workaround for a xterm size bug (by Lubos, #46153) +- workaround a problem with acrobat reader plugin on 64bit system + (by coolo, #45375) +- fix kstart behavior (by Lubos, #45919) + +------------------------------------------------------------------- +Wed Sep 29 10:18:10 CEST 2004 - adrian@suse.de + +- hide second entry for printer management + +------------------------------------------------------------------- +Wed Sep 29 09:58:37 CEST 2004 - coolo@suse.de + +- hiding the clean button again + +------------------------------------------------------------------- +Tue Sep 28 17:58:40 CEST 2004 - adrian@suse.de + +- disable XInitThread() call again., it has to moved a little bit + deeper ... + +------------------------------------------------------------------- +Mon Sep 27 17:27:59 CEST 2004 - coolo@suse.de + +- merged kdm patches for KDE 3.3 + +------------------------------------------------------------------- +Sun Sep 26 13:32:31 CEST 2004 - adrian@suse.de + +- use current 3_3_BRANCH + * fixes a possible crash of konsole +- disable the composite extension of konsole again, it cause a hang (#46098) +- update kwin composite patch +- fix hanging kparts using threads (like kaffeine/xine) again + +------------------------------------------------------------------- +Wed Sep 22 10:22:48 CEST 2004 - adrian@suse.de + +- create desktop icons also for root user + +------------------------------------------------------------------- +Mon Sep 20 23:41:08 CEST 2004 - adrian@suse.de + +- update to current 3_3_BRANCH + * various kio_fish fixes + +------------------------------------------------------------------- +Mon Sep 20 17:56:56 CEST 2004 - adrian@suse.de + +- update to current 3_3_BRANCH + * includes fix for desktop icon positions with panel on the left + (#45437) + +------------------------------------------------------------------- +Wed Sep 15 15:14:40 CEST 2004 - adrian@suse.de + +- add hook to startkde to disable IPv6 depending on + /etc/sysconfig/windowmanager + +------------------------------------------------------------------- +Tue Sep 14 14:44:16 CEST 2004 - adrian@suse.de + +- update to current BRANCH +- enable composite support in konsole (patch from Lubos) + +------------------------------------------------------------------- +Sat Sep 11 16:40:09 CEST 2004 - adrian@suse.de + +- update to current 3_3_BRANCH +- remove mad from nfb + +------------------------------------------------------------------- +Sat Sep 4 10:56:25 CEST 2004 - coolo@suse.de + +- replaced 3_2_BRANCH with 3_3_BRANCH (including fix for parallel build) +- going for unsermake (parallel build + no bugs with installing icons) + +------------------------------------------------------------------- +Sat Aug 21 20:54:16 CEST 2004 - adrian@suse.de + +- remove shadow patch +- some menu item fixes +- khelpcenter gnome support by clahey + +------------------------------------------------------------------- +Mon Aug 16 15:32:44 CEST 2004 - adrian@suse.de + +- update to version 3.3.0 final + +------------------------------------------------------------------- +Sat Aug 14 19:21:49 CEST 2004 - schwab@suse.de + +- ksysguard: rate limit SLP rescan [#43820]. + +------------------------------------------------------------------- +Fri Aug 13 11:39:02 CEST 2004 - adrian@suse.de + +- package libkfontinst for 8.2 + +------------------------------------------------------------------- +Tue Aug 10 08:58:24 CEST 2004 - adrian@suse.de + +- update to version 3.3.0 RC2 + +------------------------------------------------------------------- +Tue Aug 3 08:06:21 CEST 2004 - adrian@suse.de + +- use kde-open, if it exists + +------------------------------------------------------------------- +Mon Jul 26 21:08:06 CEST 2004 - adrian@suse.de + +- run ksysguardd as daemon (#38861) + +------------------------------------------------------------------- +Tue Jul 20 15:22:47 CEST 2004 - adrian@suse.de + +- update to KDE 3.2.92 (3.3 beta 2) + +------------------------------------------------------------------- +Tue Jun 29 09:48:30 CEST 2004 - adrian@suse.de + +- fix some aliasing warnings + +------------------------------------------------------------------- +Mon Jun 28 11:18:47 CEST 2004 - adrian@suse.de + +- update to version 3.3 beta 1 + +------------------------------------------------------------------- +Wed Jun 9 11:41:26 CEST 2004 - adrian@suse.de + +- fix ksysguardd sig11 due to slp implementation + (using a reg file now) + +------------------------------------------------------------------- +Wed Jun 2 09:58:36 CEST 2004 - adrian@suse.de + +- fix double entries in kicker quick browser. + (found by Joerg Seymer) +- fix double packaging of some icons + +------------------------------------------------------------------- +Tue Jun 1 08:33:58 CEST 2004 - adrian@suse.de + +- update to version 3.2.3 + +------------------------------------------------------------------- +Fri Apr 16 15:49:17 CEST 2004 - adrian@suse.de + +- fix compile on 8.1 + +------------------------------------------------------------------- +Fri Apr 16 12:04:19 CEST 2004 - adrian@suse.de + +- fix build for 9.0-x86_64 + +------------------------------------------------------------------- +Thu Apr 15 08:50:02 CEST 2004 - adrian@suse.de + +- fix build for < 9.1 distributions + +------------------------------------------------------------------- +Wed Apr 14 11:16:13 CEST 2004 - adrian@suse.de + +- update to version 3.2.2 + +------------------------------------------------------------------- +Tue Apr 6 18:21:30 CEST 2004 - adrian@suse.de + +- do also export locale enviroment with kdesu (#38527) + +------------------------------------------------------------------- +Tue Apr 6 08:10:02 CEST 2004 - adrian@suse.de + +- remove debug infobox on drive eject (#38294) +- fix wrong highlighted colors in gtk applications (#36935) + +------------------------------------------------------------------- +Mon Apr 5 18:16:59 CEST 2004 - adrian@suse.de + +- get KCMYAST2_CALL through kdesu +- fix yast module loading also when kcontrol already runs as root + +------------------------------------------------------------------- +Mon Apr 5 08:54:30 CEST 2004 - adrian@suse.de + +- remove second devices button in sidebar +- do use drives:/ on > 9.0 in the main devices button in the sidebar +- fix broken icon entry for sidebar services button +- kdm starts WindowMaker with "windowmaker" #38319 + +------------------------------------------------------------------- +Sun Apr 4 21:23:36 CEST 2004 - coolo@suse.de + +- update to kicker CVS for critical bug fix (replacing two other + former patches) + +------------------------------------------------------------------- +Sat Apr 3 08:52:35 CEST 2004 - coolo@suse.de + +- remove pointer to lan:/ in sidebar (#38174) +- fixing yet another place where the wrong string was used + +------------------------------------------------------------------- +Thu Apr 1 17:58:13 CEST 2004 - adrian@suse.de + +- apply fix for non-editable menu entries in kmenuedit (Waldo) + +------------------------------------------------------------------- +Thu Apr 1 15:06:58 CEST 2004 - coolo@suse.de + +- adding fix for kicker to not increase menu size because of newer + Qt (KDE #78556) + +------------------------------------------------------------------- +Thu Apr 1 09:20:05 CEST 2004 - adrian@suse.de + +- better icon for fish:/ +- don't show "mount" menu items for > 9.0 (we have subfs) + +------------------------------------------------------------------- +Wed Mar 31 17:10:35 CEST 2004 - coolo@suse.de + +- adding switchuser translations +- don't give the warning in kdesktop_lock +- add an icon to the kdm menu so that it doesn't look ugly in + thinkeramik + +------------------------------------------------------------------- +Tue Mar 30 16:35:30 CEST 2004 - adrian@suse.de + +- remove random user list file +- remove help menu entry in kdesktop to not existing help pages +- Honour global defaults & kiosk restrictions in kcmstyle (Waldo) +- ksysguardd runlevel fixes (#37614) +- fix klipperrc patch +- don't wait for arts shutdown + +------------------------------------------------------------------- +Sun Mar 28 18:39:40 CEST 2004 - adrian@suse.de + +- fix eject via kio_drives (#37156) + +------------------------------------------------------------------- +Sat Mar 27 09:23:54 CET 2004 - adrian@suse.de + +- apply fix for kicker crash by Lubos (#36360) +- use current BRANCH for kdesktop/ + * kiosk, minicli fixes and translation updates +- fixes a problem with focus stealing prevention with klipper (Lubos) +- use current BRANCH from kwin/ + * fixes pop-up windows below main window (#36682) +- fix several icons in kcontrol + +------------------------------------------------------------------- +Fri Mar 26 13:36:08 CET 2004 - coolo@suse.de + +- fixing kdm layout on personal theme +- default to shutdown when auto logined (#36856) + +------------------------------------------------------------------- +Wed Mar 24 16:12:26 CET 2004 - coolo@suse.de + +- fixing konsole pasting (#34892) +- fixing window shadow + +------------------------------------------------------------------- +Wed Mar 24 15:30:21 CET 2004 - adrian@suse.de + +- export $KDESU_USER with kdesu session + +------------------------------------------------------------------- +Mon Mar 22 09:22:59 CET 2004 - adrian@suse.de + +- update to current 3_2_BRANCH + * kcminit fixes, qt apps are using the default KDE widget style now + * Alt F2 dialog layout fixes +- call 9.1 update script +- apply default-fonts.diff again + +------------------------------------------------------------------- +Sun Mar 21 16:54:58 CET 2004 - adrian@suse.de + +- fix kcontrol yast integration + +------------------------------------------------------------------- +Wed Mar 17 23:51:12 CET 2004 - adrian@suse.de + +- move krandrtray menu entry +- move some .desktop files to correct sub package + +------------------------------------------------------------------- +Wed Mar 17 20:49:31 CET 2004 - coolo@suse.de + +- fixing NFS URLs (#36032, #36275) + +------------------------------------------------------------------- +Tue Mar 16 14:37:38 CET 2004 - coolo@suse.de + +- increasing rudi's screen space for higher stock holder value + (#36065) + +------------------------------------------------------------------- +Mon Mar 15 16:02:26 CET 2004 - coolo@suse.de + +- updating branch diff for konsole fixes (mutt, vim, irssi) + +------------------------------------------------------------------- +Fri Mar 12 17:38:58 CET 2004 - coolo@suse.de + +- fixing file test + +------------------------------------------------------------------- +Thu Mar 11 22:08:45 CET 2004 - coolo@suse.de + +- fixing user switching + +------------------------------------------------------------------- +Thu Mar 11 10:25:26 CET 2004 - coolo@suse.de + +- replace Xservers with a symlink to the real file from XFree86 +- fixing kdm layout +- fixing konsole font + +------------------------------------------------------------------- +Wed Mar 10 16:43:58 CET 2004 - coolo@suse.de + +- adding switchuser for kdm user switch support +- removing untranslated shadow from popup +- artwork.diff update for services + +------------------------------------------------------------------- +Tue Mar 9 13:34:12 CET 2004 - coolo@suse.de + +- reworked admin mode patch +- adding patch by Lubos to enhance xcursor support +- updating to latest 3_2_BRANCH (including at least 3 #s) +- adding patch by Matz to reintroduce window shadows +- adding support for HideMenu=true in kdm (#35209) + +------------------------------------------------------------------- +Mon Mar 8 11:27:23 CET 2004 - adrian@suse.de + +- use original Home folder icon again + +------------------------------------------------------------------- +Sat Mar 6 22:17:57 CET 2004 - coolo@suse.de + +- fix build with gcc 2.95 + +------------------------------------------------------------------- +Sat Mar 6 15:08:02 CET 2004 - coolo@suse.de + +- huge cleanup in the patches +- update 3_2_BRANCH diff + +------------------------------------------------------------------- +Thu Mar 4 09:55:52 CET 2004 - adrian@suse.de + +- use gtk-qt-engine only as fallback +- fix gnome startup call for kdm + +------------------------------------------------------------------- +Wed Mar 3 19:16:35 CET 2004 - coolo@suse.de + +- give us back the kdm user pictures + +------------------------------------------------------------------- +Mon Mar 1 10:34:30 CET 2004 - coolo@suse.de + +- update to version 3.2.1 + +------------------------------------------------------------------- +Fri Feb 27 19:34:12 CET 2004 - coolo@suse.de + +- adding font overwrites (again) to startkde (#30760) + +------------------------------------------------------------------- +Fri Feb 27 10:05:20 CET 2004 - coolo@suse.de + +- updated 3_2_BRANCH for kdesktop wallpaper fix (taking out + experimental patches do no longer apply because of this) +- install xdm-np pam service to fix autologin (#34674) +- fixing warnings build dislikes + +------------------------------------------------------------------- +Thu Feb 26 20:25:39 CET 2004 - adrian@suse.de + +- add kwin shadow patch again (prepared by Matz) + +------------------------------------------------------------------- +Tue Feb 24 17:51:26 CET 2004 - coolo@suse.de + +- removing kdm-xconsole - went upstream +- adding mach_blass for getting feedback +- adding kiosk patch by Waldo +- adding user switch patch for kdm + +------------------------------------------------------------------- +Sat Feb 21 17:02:14 CET 2004 - adrian@suse.de + +- one KControl menu entry is enough + +------------------------------------------------------------------- +Wed Feb 18 10:25:06 CET 2004 - coolo@suse.de + +- updating two patches +- updating mp3-info (#33151) +- removed ssh protocol +- disable kwin shadow patch again (too broken atm) + +------------------------------------------------------------------- +Tue Feb 17 15:15:54 CET 2004 - coolo@suse.de + +- fixing kdesktop icon aligning again + +------------------------------------------------------------------- +Mon Feb 16 17:46:23 CET 2004 - adrian@suse.de + +- update to current 3_2_BRANCH + * includes the kicker clock flickering fix + +------------------------------------------------------------------- +Wed Feb 11 12:03:20 CET 2004 - adrian@suse.de + +- update to current 3_2_BRANCH +- justify kcm modules in kdesktop configure dialog +- use gtk-qt-engine by default for Gtk2 apps, if installed + +------------------------------------------------------------------- +Tue Feb 10 10:13:12 CET 2004 - adrian@suse.de + +- update to current 3_2_BRANCH +- enable firewire support +- build kdm backend and pam code with -fno-strict-aliasing + +------------------------------------------------------------------- +Sun Feb 8 21:30:49 CET 2004 - adrian@suse.de + +- update to current 3_2_BRANCH +- add current kwin shadow patch + +------------------------------------------------------------------- +Mon Feb 2 10:00:36 CET 2004 - adrian@suse.de + +- fix build for older distributions +- add kickerrc config for < 9.1, because deinstallation of + kdebase3-SuSE will mess up the kicker otherwise + +------------------------------------------------------------------- +Wed Jan 28 13:48:10 CET 2004 - adrian@suse.de + +- fish can also used view ssh:/ now + +------------------------------------------------------------------- +Wed Jan 28 11:03:41 CET 2004 - adrian@suse.de + +- fix file list + +------------------------------------------------------------------- +Tue Jan 27 21:42:10 CET 2004 - adrian@suse.de + +- update to version 3.2.0 final +- cleanup and fix some more patches from 3.1 + +------------------------------------------------------------------- +Mon Jan 19 10:43:08 CET 2004 - adrian@suse.de + +- add logrotate config for kdm + +------------------------------------------------------------------- +Sun Jan 18 21:43:52 CET 2004 - adrian@suse.de + +- update to version 3.1.95 ( KDE 3.2 RC1 ) + +------------------------------------------------------------------- +Fri Jan 16 17:12:13 CET 2004 - adrian@suse.de + +- implement short menus again +- make icon size of KDE menu configurable + +------------------------------------------------------------------- +Fri Jan 16 12:56:42 CET 2004 - kukuk@suse.de + +- Add pam-devel to neededforbuild + +------------------------------------------------------------------- +Tue Jan 13 13:40:32 CET 2004 - adrian@suse.de + +- update to snapshot 2004011309 +- rename kdebase3-nsplugin to kdebase3-nsplugin64 for 64bit archs + +------------------------------------------------------------------- +Tue Dec 30 15:08:10 CET 2003 - adrian@suse.de + +- update to snapshot 2003123011 + +------------------------------------------------------------------- +Wed Dec 17 17:54:02 CET 2003 - adrian@suse.de + +- update to snapshot 2003121718 +- fix kdesktop sig11 due to extensions + +------------------------------------------------------------------- +Mon Dec 15 15:33:18 CET 2003 - adrian@suse.de + +- update to snapshot 2003121511 +- apply needed kdesktop extensions again + +------------------------------------------------------------------- +Tue Dec 2 11:38:53 CET 2003 - adrian@suse.de + +- use 3.1.94, second try tar ball + +------------------------------------------------------------------- +Mon Dec 1 22:00:31 CET 2003 - adrian@suse.de + +- update to 3.1.94 ( KDE 3.2 beta 2 ) + +------------------------------------------------------------------- +Thu Nov 13 23:14:30 CET 2003 - adrian@suse.de + +- update to new snapshot from 2003102409 +- fix kwin startup +- add SLP support for ksysguard + +------------------------------------------------------------------- +Wed Oct 29 09:59:01 CET 2003 - adrian@suse.de + +- update to KDE 3.2 beta1 + +------------------------------------------------------------------- +Tue Oct 21 09:34:51 CEST 2003 - adrian@suse.de + +- update to snapshot 2003102008 + +------------------------------------------------------------------- +Sun Oct 5 14:31:09 CEST 2003 - adrian@suse.de + +- update to snapshot 2003100510 + +------------------------------------------------------------------- +Mon Sep 29 15:59:09 CEST 2003 - adrian@suse.de + +- update to version 1.1.92 (KDE 3.2 alpha 2) + +------------------------------------------------------------------- +Sat Sep 20 16:29:17 CEST 2003 - adrian@suse.de + +- fix from Waldo, to update kicker menu, when sycoca has changed + +------------------------------------------------------------------- +Fri Sep 19 12:37:43 CEST 2003 - adrian@suse.de + +- Add Screensaver Categories, needed for Gnome (#31282) + +------------------------------------------------------------------- +Fri Sep 19 09:37:42 CEST 2003 - adrian@suse.de + +- redo nsplugin silence patch, the output is needed for the GUI + progress bar + +------------------------------------------------------------------- +Thu Sep 18 17:52:36 CEST 2003 - adrian@suse.de + +- fix a handling of shortet menu names, broken encoding for + non-latin1 (#31248) + +------------------------------------------------------------------- +Thu Sep 18 10:56:56 CEST 2003 - adrian@suse.de + +- update konsole_compose fix from Waldo (fixes issues with screen) +- silence during nspluginscan + +------------------------------------------------------------------- +Wed Sep 17 09:18:01 CEST 2003 - adrian@suse.de + +- disable kthemegr completely. It can mess up the complete setup + (#30727) +- fix touch of update90 file + +------------------------------------------------------------------- +Tue Sep 16 17:16:08 CEST 2003 - adrian@suse.de + +- apply fix from Lubos for the Double Focus problem (#29467) + +------------------------------------------------------------------- +Tue Sep 16 10:34:13 CEST 2003 - adrian@suse.de + +- higher nsplugin service priority + (pdf's are shown in embedded acroread) +- use correct background setup during autologin + +------------------------------------------------------------------- +Mon Sep 15 21:48:32 CEST 2003 - coolo@suse.de + +- providing function for the suseplugger + +------------------------------------------------------------------- +Mon Sep 15 17:30:13 CEST 2003 - coolo@suse.de + +- have pkgconfig in the neededforbuilds to get fontconfig + support (that you get if you don't calculate build dependencies + automatically) + +------------------------------------------------------------------- +Mon Sep 15 14:38:37 CEST 2003 - adrian@suse.de + +- fix typo in startkde + +------------------------------------------------------------------- +Mon Sep 15 11:33:03 CEST 2003 - adrian@suse.de + +- apply patch from coolo to fix mouse cursor settings from kcontrol + (#30760) +- clean up obsolete/double patch +- apply fix from Waldo for the kicker update script (#30767) + +------------------------------------------------------------------- +Sun Sep 14 23:33:54 CEST 2003 - coolo@suse.de + +- fixes for suseplugger placement + +------------------------------------------------------------------- +Sat Sep 13 13:56:31 CEST 2003 - adrian@suse.de + +- apply fix from Waldo for editing icon entries in kicker (#30606) +- fix Unimportant entries finaly. +- update suse_default_move.diff patch to new verions from coolo + * fixes icon placement finally, hopefully +- implement second level menu sorting + +------------------------------------------------------------------- +Fri Sep 12 15:55:00 CEST 2003 - coolo@suse.de + +- fixing the aligning of the default icons + +------------------------------------------------------------------- +Fri Sep 12 11:33:14 CEST 2003 - coolo@suse.de + +- set background even on autologin users + +------------------------------------------------------------------- +Thu Sep 11 08:33:28 CEST 2003 - adrian@suse.de + +- redone 3.1.4 tar ball, whith kdesu enviroment fix +- apply branch patch with kdesktop rename fix +- add new console font from mfabian with an EUR char +- fix copy quoting of kdesktop addIcon +- export $STYLE to get a matching look in xmms +- new version for krdb-gtk2 patch from coolo +- fix from Waldo to show UTF-8 in konsole correct (#25146) +- prepare startkde script to call the 9.0 update script + +------------------------------------------------------------------- +Wed Sep 10 13:23:15 CEST 2003 - coolo@suse.de + +- check a specific dcop interface (kdesktop). that's less likely to + stay stale (#30148) + +------------------------------------------------------------------- +Tue Sep 9 15:58:30 CEST 2003 - coolo@suse.de + +- remove unused patch7 +- add patch to force xft2 usage on qt3 in konsole (#29164) + +------------------------------------------------------------------- +Tue Sep 9 01:17:23 CEST 2003 - adrian@suse.de + +- do even apply coolos patch +- further kcontrol yast patch. we need only one line in the + desktop file now and can keep a usual Exec line + +------------------------------------------------------------------- +Tue Sep 9 00:13:49 CEST 2003 - adrian@suse.de + +- update to version 3.1.4 +- some missing bits, to be able to load YaST embedded into kcontrol + again + +------------------------------------------------------------------- +Mon Sep 8 20:23:34 CEST 2003 - coolo@suse.de + +- update smb code in CVS to include more detailed error message +- add debug code as found a problem in our windows network which + might hit more users + +------------------------------------------------------------------- +Mon Sep 8 15:22:33 CEST 2003 - coolo@suse.de + +- fixing kdesktop to read .directory on new files +- updating short-menus diff from adrian + +------------------------------------------------------------------- +Fri Sep 5 13:52:05 CEST 2003 - adrian@suse.de + +- honor also X-SuSE-Unimportant entries during menu shorting +- new kmenuedit from Waldo, fixing creation of new entries +- add gtk2-set-enviroment patch from Lubos to fix encoding problems +- handle special flags for folder (no shorting and name usage) +- new handling of GTK theme, made by Stanislav Brabec +- kfontinst: reload instead of restart the xfs +- kfontinst: call also SuSEconfig --module fonts +- make KControl visible in main menu + +------------------------------------------------------------------- +Thu Sep 4 16:42:43 CEST 2003 - adrian@suse.de + +- remove clock kcm module. it breaks the system and we have a + YaST modul for this purpose. +- new patch from Waldo to fix kcontrol yast module menu +- stop/restart ksysguardd on update/remove + +------------------------------------------------------------------- +Thu Sep 4 14:12:19 CEST 2003 - adrian@suse.de + +- some desktop Categories tuning + +------------------------------------------------------------------- +Tue Sep 2 13:16:53 CEST 2003 - adrian@suse.de + +- kwrite becomes unimportant + +------------------------------------------------------------------- +Mon Sep 1 14:48:24 CEST 2003 - adrian@suse.de + +- update to current 3_1_BRANCH + * contains kwin resize fix for xmms from Lubos +- implement X-SuSE-Unimportant support +- apply crash fix for khelpcenter from Cornelius +- coolo: add check in startkde for already running kde + +------------------------------------------------------------------- +Sun Aug 31 16:58:23 CEST 2003 - adrian@suse.de + +- implement menu auto shorting in kicker + +------------------------------------------------------------------- +Sat Aug 30 21:20:22 CEST 2003 - adrian@suse.de + +- fix kdm startup error +- disable password field for no-password-for-all-users mode + +------------------------------------------------------------------- +Sat Aug 30 14:33:43 CEST 2003 - adrian@suse.de + +- update xdg patch to new version from Waldo. + +------------------------------------------------------------------- +Fri Aug 29 17:26:55 CEST 2003 - adrian@suse.de + +- update to current 3_1_BRANCH for kdm security fixes + +------------------------------------------------------------------- +Wed Aug 27 08:20:45 CEST 2003 - adrian@suse.de + +- fixing smb:/ protocol by using libsmbclient from samba 3 +- hide "Open In Terminal" entries in kicker by default + +------------------------------------------------------------------- +Tue Aug 26 13:58:02 CEST 2003 - adrian@suse.de + +- implement the kdm admin mode + +------------------------------------------------------------------- +Tue Aug 26 08:19:20 CEST 2003 - adrian@suse.de + +- apply fix from Lubos for maximised windows of GTK apps + +------------------------------------------------------------------- +Sun Aug 24 19:44:55 CEST 2003 - adrian@suse.de + +- let kthumbnailcreator use ksvgiconengine + +------------------------------------------------------------------- +Sat Aug 23 22:35:16 CEST 2003 - adrian@suse.de + +- update to 3_1_BRANCH + +------------------------------------------------------------------- +Wed Aug 20 18:30:27 CEST 2003 - adrian@suse.de + +- apply fix from Lubos for khotkey support with XDG + +------------------------------------------------------------------- +Sat Aug 16 20:23:35 CEST 2003 - adrian@suse.de + +- rpm -V fixes + +------------------------------------------------------------------- +Fri Aug 15 10:25:34 CEST 2003 - adrian@suse.de + +- set Categories for KControl via patch + +------------------------------------------------------------------- +Thu Aug 14 16:17:44 CEST 2003 - adrian@suse.de + +- add %ghost /var/run/xdmctl + +------------------------------------------------------------------- +Wed Aug 13 15:40:04 CEST 2003 - adrian@suse.de + +- use new places of gtkrc-$STYLE files +- use current 3_1_BRANCH + +------------------------------------------------------------------- +Tue Aug 12 13:18:38 CEST 2003 - adrian@suse.de + +- justify Categories +- new XDG patch from Waldo + +------------------------------------------------------------------- +Thu Aug 7 17:09:02 CEST 2003 - adrian@suse.de + +- update XDG patch + +------------------------------------------------------------------- +Thu Aug 7 14:43:29 CEST 2003 - adrian@suse.de + +- new code from Waldo: kmenuedit can handle XDG now +- require smbclnt, if samba 3 is not used + +------------------------------------------------------------------- +Sun Aug 3 15:11:32 CEST 2003 - adrian@suse.de + +- fix build for 8.2 + +------------------------------------------------------------------- +Fri Aug 1 19:49:47 CEST 2003 - adrian@suse.de + +- disable shadow text at all +- add patch to support kwin shadow windows instead + +------------------------------------------------------------------- +Tue Jul 29 15:59:21 CEST 2003 - adrian@suse.de + +- disable shadow text for 8.2 +- fix build for 8.2 (now it really works everywhere for sure, I hope) + +------------------------------------------------------------------- +Tue Jul 29 10:36:18 CEST 2003 - adrian@suse.de + +- fix build for < 8.0 + +------------------------------------------------------------------- +Mon Jul 28 14:06:58 CEST 2003 - cschum@suse.de + +- Updated KHelpcenter tarball. Fixes bug #24374. + +------------------------------------------------------------------- +Fri Jul 25 11:36:34 CEST 2003 - cschum@suse.de + +- Added KHelpcenter from CVS HEAD. + +------------------------------------------------------------------- +Fri Jul 25 09:24:51 CEST 2003 - adrian@suse.de + +- fix build for < 8.1 +- add Categories + +------------------------------------------------------------------- +Sat Jul 19 22:29:07 CEST 2003 - adrian@suse.de + +- add XDG patch from Waldo +- add backported patch from 3.2 for shadow text on icons. + kcontrol changes are not included for i18n compliance + (written by Laur Ivan <laurivan@eircom.net>) + +------------------------------------------------------------------- +Wed Jul 16 15:07:55 CEST 2003 - adrian@suse.de + +- update to version 3.1.3 + +------------------------------------------------------------------- +Wed Jun 25 09:13:07 CEST 2003 - coolo@suse.de + +- updating 3_1_BRANCH diff (heading 3.1.3) + +------------------------------------------------------------------- +Mon Jun 23 16:22:33 CEST 2003 - schwab@suse.de + +- Remove trailing spaces from Xpdf.ad. + +------------------------------------------------------------------- +Fri Jun 13 11:01:30 CEST 2003 - coolo@suse.de + +- package directories + +------------------------------------------------------------------- +Fri May 30 15:20:18 CEST 2003 - adrian@suse.de + +- fix build on non-fast-malloc architectures + +------------------------------------------------------------------- +Mon May 26 15:45:14 CEST 2003 - adrian@suse.de + +- use $INSTALL_TARGET +- all config files are %config(noreplace) now +- startkde.lib is obsolete in future + +------------------------------------------------------------------- +Mon May 26 11:14:12 CEST 2003 - adrian@suse.de + +- do not save original startkde (fix build for rpm4) + +------------------------------------------------------------------- +Wed May 21 14:01:41 CEST 2003 - adrian@suse.de + +- add fix from Lubos to start preloaded Konq on correct screen +- drop patch which ignores global malloc + +------------------------------------------------------------------- +Thu May 15 07:49:15 CEST 2003 - adrian@suse.de + +- 3.1.2, take four + +------------------------------------------------------------------- +Mon May 12 18:08:54 CEST 2003 - adrian@suse.de + +- update to 3.1.2, take three +- use $HOME/.fonts path also via XLFD + +------------------------------------------------------------------- +Thu May 8 16:43:08 CEST 2003 - ro@suse.de + +- fileshareset2: include errno in fssConfigNfs.cpp + +------------------------------------------------------------------- +Thu May 8 09:33:32 CEST 2003 - adrian@suse.de + +- update to 3.1.2 + * cleanup patches + +------------------------------------------------------------------- +Fri Apr 18 16:26:25 CEST 2003 - adrian@suse.de + +- merge 8.2 and 8.3 stream + +------------------------------------------------------------------- +Wed Apr 9 17:34:22 CEST 2003 - adrian@suse.de + +- security fix, call ghostscript in safe mode. +- replace fileshareset utility with a working one + (written by Uwe Gansert, reviewed by security-team) + Only samba exports for now, nfs is disabled for security reasons +- add global gtkrc to enviroment variable to fix used encoding +- fix kdm behaviour after wrong password (#25727) + +------------------------------------------------------------------- +Sun Mar 16 19:22:16 CET 2003 - adrian@suse.de + +- fix console font size also in konsole code +- workaround a qt bug to find a fixed font (#25430) + (do not recalculate the pixelSize via dpi) + +------------------------------------------------------------------- +Sat Mar 15 18:58:45 CET 2003 - adrian@suse.de + +- xmms can't handle .m3u files in a stream +- ensure that $kdehome is set during startkde run +- remove xset font calls in startkde + (reduces warnings during KDE startup and is not needed with fontconfig) + +------------------------------------------------------------------- +Fri Mar 14 10:00:16 CET 2003 - adrian@suse.de + +- fix from Lubos to disable kdesu parameters, when running in + kcmshell already (first part to fix #25230) +- remove senseless permissions file (we don't have a suid perl) + +------------------------------------------------------------------- +Wed Mar 12 18:00:19 CET 2003 - adrian@suse.de + +- fix the last place of hardcoded kdmrc path +- fix build for < 8.2 + +------------------------------------------------------------------- +Wed Mar 12 17:08:09 CET 2003 - adrian@suse.de + +- add sensors support to ksysguard again +- apply fix from Lubos for kdm mouse cursor + +------------------------------------------------------------------- +Wed Mar 12 14:25:58 CET 2003 - adrian@suse.de + +- fix kxkb extension for XFree 4.3 +- fix nsplugin scan init + +------------------------------------------------------------------- +Tue Mar 11 11:26:06 CET 2003 - adrian@suse.de + +- fix kdm layout/position +- disable unneeded Menu and Erase button +- use standard button ordering in kdm +- fix encoding usage for user names +- add fix from Lubos for Konqueror session management +- add fix from Coolo for pam-error-message handling in kdm +- add PreReq: aaa_base in kdebase3-ksysguardd to be able to update + from 7.3 +- add fix from Cornelius to let khelpcenter use the correct language +- fallback gtkrc style is keramik/geramik + +------------------------------------------------------------------- +Sun Mar 9 00:30:15 CET 2003 - adrian@suse.de + +- apply kdm patches again for console +- use better icon for "new session" +- use console8x16 font from HEAD to fix freetype2 issues +- check only for lowercase gtkrc-$STYLE's +- fix remote .pls file handling with xmms +- run update script, if present + +------------------------------------------------------------------- +Tue Mar 4 18:33:10 CET 2003 - adrian@suse.de + +- add missing Provides/Obsoletes kdialog +- use a better icon for Home directory items + +------------------------------------------------------------------- +Sat Mar 1 23:23:42 CET 2003 - adrian@suse.de + +- update to version 3.1.1 + * kwin fixes: don't show toplevel menus for non-active windows. + * konq fixes: don't repost data on reload, if url changes + sidebar crash fix + * nsplugin viewer: fixes and NPN_PostURL* support. +- update kcmrandr and patches from Lubos + * restoring resolution by kcminit works now +- Konqueror preloading fixes from Lubos + * creating KonqMainWindow on --preload +- disable klipper actions of not installed apps +- add /usr/lib{,64}/browser-plugins/ path to scan list +- fix build on non-ia32/x86_64 +- drop obsoletes patches + +------------------------------------------------------------------- +Fri Feb 28 00:31:38 CET 2003 - adrian@suse.de + +- update 3_1_BRANCH patch +- update preloaded konq patch from Lubos +- drop Obsoletes kdebase again +- fix quickbrowser patch to show entries only once + +------------------------------------------------------------------- +Wed Feb 26 12:14:15 CET 2003 - adrian@suse.de + +- update 3_1_BRANCH patch +- follow susewatcher directory change +- Obsoletes kdebase + +------------------------------------------------------------------- +Mon Feb 24 11:27:16 CET 2003 - adrian@suse.de + +- update 3_1_BRANCH patch +- fix kdmrc path in kcm_kdm +- use yast for setting the clock in kicker/applet/clock + +------------------------------------------------------------------- +Sat Feb 22 14:37:31 CET 2003 - kukuk@suse.de + +- If we provide kdebase, we should also obsolete the old one. + +------------------------------------------------------------------- +Thu Feb 20 11:49:36 CET 2003 - cschum@suse.de + +- Fixed check, if khelpcenter index builder needs root permissions. + +------------------------------------------------------------------- +Wed Feb 19 13:19:57 CET 2003 - adrian@suse.de + +- fix typo in Provides for kdm, fixes update from kde 2 + +------------------------------------------------------------------- +Tue Feb 18 14:05:31 CET 2003 - adrian@suse.de + +- fix build for < 8.2 + +------------------------------------------------------------------- +Tue Feb 18 11:58:45 CET 2003 - adrian@suse.de + +- add Provides kdebase3-konqueror + +------------------------------------------------------------------- +Mon Feb 17 14:16:08 CET 2003 - adrian@suse.de + +- use gtk[2]rc-$STYLE to be more flexible + +------------------------------------------------------------------- +Mon Feb 17 10:03:02 CET 2003 - adrian@suse.de + +- set enviroment to use special kde themings for gtk apps + +------------------------------------------------------------------- +Sun Feb 16 16:56:13 CET 2003 - adrian@suse.de + +- install kappfinder_install, fixes susewm build +- disable obsolete quick browser patch + +------------------------------------------------------------------- +Sun Feb 16 01:35:35 CET 2003 - adrian@suse.de + +- create susewatcher Desktop icon on the fly +- remove unneeded requires + +------------------------------------------------------------------- +Sat Feb 15 16:58:59 CET 2003 - adrian@suse.de + +- update 3_1_BRANCH patch +- fix qt/xrandr signal usage +- add konqueror preload patches from Lubos +- extend kdesktop addIcon api +- add additional Desktop path for kdesktop for susewatcher icons +- let kicker accept $HOME pathes + +------------------------------------------------------------------- +Tue Feb 11 01:30:10 CET 2003 - adrian@suse.de + +- let kdesktop use susewatcher directory +- add RandR tools + +------------------------------------------------------------------- +Fri Feb 7 13:28:53 CET 2003 - cschum@suse.de + +- new search index generation for khelpcenter which doesn't + necessarily need root permissions + +------------------------------------------------------------------- +Fri Jan 24 18:06:29 CET 2003 - adrian@suse.de + +- apply patches from Lubos to use XrandR +- add check for prelinked systems in startkde + +------------------------------------------------------------------- +Wed Jan 22 09:01:39 CET 2003 - adrian@suse.de + +- fix file list +- disable xsetroot in startkde + +------------------------------------------------------------------- +Fri Jan 17 14:50:13 CET 2003 - adrian@suse.de + +- use RC7-try2 tar ball + +------------------------------------------------------------------- +Thu Jan 16 16:29:09 CET 2003 - adrian@suse.de + +- update to RC7 +- merge kdebase3-konqueror into kdebase3 again +- do not link kdesysguardd against libkdefakes + +------------------------------------------------------------------- +Mon Jan 13 10:50:14 CET 2003 - adrian@suse.de + +- clean up #neededforbuild + +------------------------------------------------------------------- +Fri Jan 10 09:47:53 CET 2003 - coolo@suse.de + +- adding metadata to fillup +- use KDE_FAST_MALLOC only for distribution versions + < 8.2 (without metadata for them) + +------------------------------------------------------------------- +Wed Jan 8 17:16:41 CET 2003 - coolo@suse.de + +- using the real euro symbol instead of the subscript + (#21779) + +------------------------------------------------------------------- +Wed Jan 8 16:34:45 CET 2003 - coolo@suse.de + +- making cursor changes in kcontrol work (#21777) + +------------------------------------------------------------------- +Tue Jan 7 15:08:32 CET 2003 - adrian@suse.de + +- update to RC6 + +------------------------------------------------------------------- +Thu Dec 5 12:09:05 CET 2002 - adrian@suse.de + +- fix build + +------------------------------------------------------------------- +Tue Dec 3 16:45:23 CET 2002 - adrian@suse.de + +- apply kdesktop icon placement patches again. + +------------------------------------------------------------------- +Mon Dec 2 15:48:56 CET 2002 - adrian@suse.de + +- update startkde script to 3.1 + * fixes session handling + +------------------------------------------------------------------- +Sat Nov 30 21:49:13 CET 2002 - adrian@suse.de + +- new try of RC5 tar ball. BRANCH fixes are disabled again. + +------------------------------------------------------------------- +Fri Nov 29 14:45:59 CET 2002 - adrian@suse.de + +- revert kicker changes (compile failed with 2.95) + +------------------------------------------------------------------- +Thu Nov 28 16:07:58 CET 2002 - adrian@suse.de + +- use current 3_1_BRANCH fixes + +------------------------------------------------------------------- +Mon Nov 25 20:26:17 CET 2002 - adrian@suse.de + +- update to RC5 + +------------------------------------------------------------------- +Sun Nov 24 00:29:31 CET 2002 - adrian@suse.de + +- move kcm samba module into samba subpackage +- move thememgr into extra package + +------------------------------------------------------------------- +Sat Nov 23 17:59:54 CET 2002 - adrian@suse.de + +- fix build for < SuSE 7.3 + +------------------------------------------------------------------- +Wed Nov 20 12:09:05 CET 2002 - adrian@suse.de + +- remove obsolete kdm-xconsole patch + +------------------------------------------------------------------- +Wed Nov 20 11:24:05 CET 2002 - adrian@suse.de + +- update to version 3.1-RC4 (final ?) + +------------------------------------------------------------------- +Wed Nov 20 11:15:22 CET 2002 - adrian@suse.de + +- update to version 3.1-RC4 (final ?) + +------------------------------------------------------------------- +Fri Nov 15 10:46:41 CET 2002 - coolo@suse.de + +- removed one more patch that isn't needed with + the later CVS snapshot + +------------------------------------------------------------------- +Tue Nov 12 14:12:45 CET 2002 - coolo@suse.de + +- sorted patches out +- update snapshot to include a last minute fix for + new kdelibs + +------------------------------------------------------------------- +Wed Nov 6 17:36:07 CET 2002 - adrian@suse.de + +- update to snapshot 3.0.8.20021106 + +------------------------------------------------------------------- +Tue Nov 5 14:26:38 CET 2002 - adrian@suse.de + +- update to snapshot 20021030 + ( fixes file conflicts with kdelibs ) + +------------------------------------------------------------------- +Sun Nov 3 13:16:21 CET 2002 - adrian@suse.de + +- update to version 3.0.9.20021030 ~= RC1 + +------------------------------------------------------------------- +Tue Oct 8 21:23:32 CEST 2002 - adrian@suse.de + +- update to version 3.0.4 + +------------------------------------------------------------------- +Thu Sep 26 16:28:19 CEST 2002 - adrian@suse.de + +- limit kconsole log lines to 100 (fixes the memory "leak") +- kate encoding fix from HEAD (#20139) + +------------------------------------------------------------------- +Tue Sep 17 17:53:44 CEST 2002 - adrian@suse.de + +- fix kdesktop lock behaviour with "focus under mouse" settings + (credit for finding it goes to Lubos) + +------------------------------------------------------------------- +Fri Sep 13 14:19:07 CEST 2002 - coolo@suse.de + +- fixing the fix for nspluginscan + +------------------------------------------------------------------- +Wed Sep 11 01:00:30 CEST 2002 - adrian@suse.de + +- disable Console Login option in kdm menu + +------------------------------------------------------------------- +Mon Sep 9 17:54:53 CEST 2002 - adrian@suse.de + +- add fix from ossi to suppress "new session" buttons, when not + started via kdm +- use launch icon for "new session" entries +- fix acroread default colors + +------------------------------------------------------------------- +Mon Sep 9 13:49:55 CEST 2002 - coolo@suse.de + +- fixing #19212 in showing all printers if there is no + printer defined to be used + +------------------------------------------------------------------- +Mon Sep 9 02:31:07 CEST 2002 - adrian@suse.de + +- fix compile + +------------------------------------------------------------------- +Mon Sep 9 01:21:35 CEST 2002 - adrian@suse.de + +- fix focus handling with locking screensavers +- make kdm quiet + +------------------------------------------------------------------- +Sun Sep 8 13:50:27 CEST 2002 - adrian@suse.de + +- fixes from Ossi for chooser. I disable it anyway by default to + get sure. +- disable auto-new-session on lock +- use own Xsetup script (fix the double root window setup) +- fix kcontrol/kdm to write the right (superior) kdmrc file +- update the fallback kdmrc to fix values from kdebase3-SuSE +- move krootimage to kdm package +- add split alias for -kdm and -konqueror package + +------------------------------------------------------------------- +Fri Sep 6 01:08:50 CEST 2002 - adrian@suse.de + +- apply last bits from Ossi + * adds "create new session" feature +- remove chooser from menu button in kdm, since it does not work atm +- we still use kdmrc for kdm desktop settings, so kdm must some settings + (we do not need to replace the kcm module) +- disable the nohang patch, we are fast enough to live without now :) + +------------------------------------------------------------------- +Thu Sep 5 14:42:53 CEST 2002 - coolo@suse.de + +- found work around for nsplugin and real player plugin + (major PR 18083) + +------------------------------------------------------------------- +Wed Sep 4 10:44:22 MEST 2002 - coolo@suse.de + +- applying fix for PR18629 (suse tour broken) +- fixing rcksysguardd +- don't line up icons on font change + +------------------------------------------------------------------- +Wed Sep 4 01:11:43 CEST 2002 - adrian@suse.de + +- update to latest kdm version from ossi + * fixes possible seg fault / support user defined log file + * adds chooser + * GUI cleanup +- set background color after installing theme + +------------------------------------------------------------------- +Mon Sep 2 11:54:50 CEST 2002 - coolo@suse.de + +- don't crash kicker on switching desktops while renaming + +------------------------------------------------------------------- +Fri Aug 30 07:48:49 CEST 2002 - adrian@suse.de + +- fix for kfindpart crash ( it does since memory leak fix) +- install root theme also when kdesu has been used from a user + account before +- move kpersonalizer pictures to main package, the greeter is using it + +------------------------------------------------------------------- +Fri Aug 23 08:17:54 CEST 2002 - adrian@suse.de + +- we do not need kdm_position patch anymore (xconsole will go away :) +- add patch to check for kdmrc in /etc and /opt +- install and package kappfinder_install (used by susewm) +- do not create a sub menu for Terminal and Konq in kicker/quickbrowser +- disable tracing of kdesud via prctl() instead of set gid bit (hint from okir) +- hot fix for kdm xconsole + +------------------------------------------------------------------- +Wed Aug 21 00:19:34 CEST 2002 - adrian@suse.de + +- apply kdm xconsole patch from ossi with some changes +- let konqueror->Go->Applications go to {/etc/,}opt/kde3/share/applnk +- set explicit kcheckpass permissions in %files section +- use default kdmrc in /opt only and make /etc free for theme package +- add extra hooks for additional UL calls +- coolo: fix kicker_default patch +- coolo: fix khelpcenter startup + +------------------------------------------------------------------- +Tue Aug 20 10:49:57 CEST 2002 - coolo@suse.de + +- fixing kicker default for smaller resolutions + +------------------------------------------------------------------- +Mon Aug 19 21:27:19 CEST 2002 - adrian@suse.de + +- unset also QTDIR in startkde +- update khelpcenter to current HEAD snapshot + +------------------------------------------------------------------- +Mon Aug 19 15:07:15 CEST 2002 - coolo@suse.de + +- changed ShowUsers from All to NotHidden + +------------------------------------------------------------------- +Mon Aug 19 14:27:29 CEST 2002 - coolo@suse.de + +- use Nimbus Sans l when installed instead of helvetica + +------------------------------------------------------------------- +Sun Aug 18 12:19:18 CEST 2002 - adrian@suse.de + +- fix PreRequires + +------------------------------------------------------------------- +Wed Aug 14 14:52:46 CEST 2002 - coolo@suse.de + +- 400 is too few on 800x600 - 480 is minimum (6 buttons remaining) + +------------------------------------------------------------------- +Tue Aug 13 10:59:19 CEST 2002 - coolo@suse.de + +- changed kcheckpass to suid root again as discussed with kukuk + (needed for nisplus+ldap) + +------------------------------------------------------------------- +Mon Aug 12 15:09:54 CEST 2002 - coolo@suse.de + +- don't name the default_desktop stuff suse_ +- let the scripts specify the row/col +- fix the name of the resulting icons +- remove the file from auto start after having done the work +- keep 100 pixels more for the taskbar + +------------------------------------------------------------------- +Sun Aug 11 12:55:30 CEST 2002 - coolo@suse.de + +- splitting the kdesktop moving patch from the suse_default patch + and fixing both + +------------------------------------------------------------------- +Sat Aug 10 22:30:42 CEST 2002 - coolo@suse.de + +- changed the way kicker sets the default config + +------------------------------------------------------------------- +Sat Aug 10 20:46:47 CEST 2002 - adrian@suse.de + +- disable kdesktop patch for now + +------------------------------------------------------------------- +Sat Aug 10 18:58:21 CEST 2002 - adrian@suse.de + +- second try of gcc 3 fix for suse_move_default_desktop + (yes, again untested ;) + +------------------------------------------------------------------- +Sat Aug 10 18:40:15 CEST 2002 - adrian@suse.de + +- fix build for 7.3 and older + +------------------------------------------------------------------- +Sat Aug 10 11:28:23 CEST 2002 - adrian@suse.de + +- fix build of suse_move_default_desktop for gcc 3 + +------------------------------------------------------------------- +Fri Aug 9 17:38:38 CEST 2002 - adrian@suse.de + +- add workaround for plugins when compiled with gcc 3.x (from malte) + +------------------------------------------------------------------- +Fri Aug 9 15:41:09 CEST 2002 - coolo@suse.de + +- adding suse_move_default_desktop - to be used through + kdebase-SuSE (the name of the tool isn't visible to the + user, so other UL parties can use it too :) + +------------------------------------------------------------------- +Fri Aug 9 12:05:37 CEST 2002 - adrian@suse.de + +- fix build for older distributions + +------------------------------------------------------------------- +Thu Aug 8 17:43:07 CEST 2002 - adrian@suse.de + +- fix stupid typo in spec file + +------------------------------------------------------------------- +Thu Aug 8 02:55:20 CEST 2002 - adrian@suse.de + +- update to version 3.0.3 +- update khelpcenter from current HEAD + +------------------------------------------------------------------- +Wed Aug 7 09:52:22 CEST 2002 - coolo@suse.de + +- show the default printer's jobs by default + +------------------------------------------------------------------- +Tue Aug 6 15:37:14 CEST 2002 - coolo@suse.de + +- fixing the fix + +------------------------------------------------------------------- +Tue Aug 6 12:49:11 CEST 2002 - coolo@suse.de + +- extending konsole fix + +------------------------------------------------------------------- +Tue Aug 6 11:27:33 CEST 2002 - coolo@suse.de + +- fixing konsole on PPC + +------------------------------------------------------------------- +Fri Aug 2 14:05:08 CEST 2002 - coolo@suse.de + +- don't use lilo reboot option by default + +------------------------------------------------------------------- +Thu Aug 1 11:00:20 CEST 2002 - adrian@suse.de + +- fix PreRequires +- set default kdmrc greeting string to "United Linux 1.0" +- fix %post / %pre scripts + +------------------------------------------------------------------- +Wed Jul 24 20:20:44 CEST 2002 - adrian@suse.de + +- fix #neededforbuild + +------------------------------------------------------------------- +Mon Jul 22 10:55:34 CEST 2002 - coolo@suse.de + +- fixing scope of the lib64 patch + +------------------------------------------------------------------- +Fri Jul 19 15:03:18 CEST 2002 - adrian@suse.de + +- do not export KDE_MALLOC anymore + +------------------------------------------------------------------- +Thu Jul 18 23:34:11 CEST 2002 - adrian@suse.de + +- fix file list + +------------------------------------------------------------------- +Wed Jul 17 16:26:26 CEST 2002 - adrian@suse.de + +- split samba dependend libs into -samba subpackage +- use updated lib64 patches from coolo +- fix build for several changes in base system + +------------------------------------------------------------------- +Tue Jul 16 16:51:22 CEST 2002 - coolo@suse.de + +- fixing location for ldap on lib64 architectures +- fixing cddb entries for Schwab's CD + +------------------------------------------------------------------- +Sun Jul 14 19:18:36 CEST 2002 - adrian@suse.de + +- split sub-packages for kdm, konqueror and unneeded extra stuff. +- do not start kinternet for 8.1 and higher by startkde +- apply fix for smb kio from coolo +- apply fix for kpager from coolo +- apply fix to fix time stamps when handle with konqueror from coolo +- fix USE_FAM variable in startscript + +------------------------------------------------------------------- +Mon Jul 1 14:03:40 CEST 2002 - adrian@suse.de + +- fix default settings for klipper to start Netscape and Mozilla + +------------------------------------------------------------------- +Mon Jun 24 21:00:55 CEST 2002 - adrian@suse.de + +- update to version 3.0.2 + +------------------------------------------------------------------- +Wed Jun 12 14:24:38 CEST 2002 - coolo@suse.de + +- cleanup around $configkde + +------------------------------------------------------------------- +Mon Jun 10 20:11:45 CEST 2002 - adrian@suse.de + +- fix memory leak in kfind (partitial, but the bigger one ;) + +------------------------------------------------------------------- +Mon Jun 10 14:11:37 CEST 2002 - coolo@suse.de + +- adding fix for cddb computation + +------------------------------------------------------------------- +Mon Jun 10 00:56:03 CEST 2002 - adrian@suse.de + +- fix build on lib64 (audiocd slave) + +------------------------------------------------------------------- +Wed May 29 11:17:41 CEST 2002 - adrian@suse.de + +- use update_admin +- add extra optional script directory /opt/kde3/share/addon-scripts/ +- check for tmp-$HOST symlinks in startscript + +------------------------------------------------------------------- +Tue May 14 12:55:35 CEST 2002 - adrian@suse.de + +- update to 3.0.1, second try +- memory leak fixes for kicker + +------------------------------------------------------------------- +Fri May 10 13:43:31 CEST 2002 - adrian@suse.de + +- update to 3.0.1 + +------------------------------------------------------------------- +Tue May 7 15:28:30 CEST 2002 - meissner@suse.de + +- generic KDE Libdir fixes, fixed updatedialog compilation. + +------------------------------------------------------------------- +Wed Apr 17 14:04:55 CEST 2002 - adrian@suse.de + +- do not overwrite root-user settings + +------------------------------------------------------------------- +Mon Apr 15 13:12:58 CEST 2002 - adrian@suse.de + +- add pre install script to check for a /opt/kde3/share/config/kdm + directory. +- rename ksysguardd3 back to ksysguardd + +------------------------------------------------------------------- +Wed Mar 27 18:01:22 CET 2002 - adrian@suse.de + +- do not start kpersonilzer (fix it really) + +------------------------------------------------------------------- +Wed Mar 27 12:08:09 CET 2002 - adrian@suse.de + +- remove wrong double quotes around the Desktop copy routine +- disable kpersonalizer on autostart + (it mess up some systems during update) + +------------------------------------------------------------------- +Wed Mar 27 12:07:04 CET 2002 - kukuk@suse.de + +- Remove last konsole patch + +------------------------------------------------------------------- +Tue Mar 26 15:16:37 CET 2002 - adrian@suse.de + +- crash fix for konqueror, when browsing not readable directorys + (made by Andreas Schwab) + +------------------------------------------------------------------- +Mon Mar 25 20:33:10 CET 2002 - adrian@suse.de + +- update tar ball to 3.0 final, second try +- add window raise fix for ktaskbar in kicker + +------------------------------------------------------------------- +Mon Mar 25 11:25:49 CET 2002 - adrian@suse.de + +- update to 3.0 final (everything is wonderfull release) +- unset $KDEDIRS instead of exporting, we have /etc/kde3rc now + +------------------------------------------------------------------- +Thu Mar 21 17:43:25 CET 2002 - adrian@suse.de + +- update to 3.0rc3 +- change to new SuSE background, if the user is still using the + old version + +------------------------------------------------------------------- +Mon Mar 18 09:04:00 CET 2002 - adrian@suse.de + +- fix ~/.kde2->~/.kde copy routine + +------------------------------------------------------------------- +Fri Mar 15 00:33:20 CET 2002 - ro@suse.de + +- changed neededforbuild <ssh> to <openssh> + +------------------------------------------------------------------- +Sun Mar 10 23:07:19 CET 2002 - adrian@suse.de + +- fix %pre install script + +------------------------------------------------------------------- +Sun Mar 10 17:05:52 CET 2002 - adrian@suse.de + +- update to 3.0rc2 + +------------------------------------------------------------------- +Tue Mar 5 09:14:54 CET 2002 - ro@suse.de + +- fixed pre-install + +------------------------------------------------------------------- +Mon Mar 4 17:38:37 CET 2002 - adrian@suse.de + +- update to 3.0rc1 + +------------------------------------------------------------------- +Tue Feb 26 15:49:14 CET 2002 - adrian@suse.de + +- fix startscript (use changed sysconfig variables) + +------------------------------------------------------------------- +Tue Feb 26 14:41:14 CET 2002 - adrian@suse.de + +- fix updatedialog install + +------------------------------------------------------------------- +Tue Feb 26 13:03:32 CET 2002 - adrian@suse.de + +- update to snapshot 2.92.2002022519 + +------------------------------------------------------------------- +Thu Feb 14 01:11:30 CET 2002 - adrian@suse.de + +- update to snapshot 2.92.2002021421 +- move Doug Lea's malloc to kdelibs3 + (can be configured via kdebase3-SuSE) +- fix samba support +- add KDE 2 -> 3 update tool + +------------------------------------------------------------------- +Tue Feb 12 02:39:22 CET 2002 - adrian@suse.de + +- add optional Doug Lea's fast malloc implementation +- fix ownership of files + +------------------------------------------------------------------- +Mon Feb 11 15:14:13 CET 2002 - adrian@suse.de + +- update to snapshot 2.92.2002021111 +- add rckdm symlink +- kdm follows qtrc + +------------------------------------------------------------------- +Wed Feb 6 21:57:56 CET 2002 - adrian@suse.de + +- update to version 2.92 (KDE 3.0 beta 2) +- use common_compile_flags + +------------------------------------------------------------------- +Tue Jan 29 12:56:23 CET 2002 - adrian@suse.de + +- fix startkde script to call startkde.theme early enough + +------------------------------------------------------------------- +Mon Jan 28 16:52:04 CET 2002 - adrian@suse.de + +- fix $KDEDIRS + +------------------------------------------------------------------- +Mon Jan 28 15:21:04 CET 2002 - adrian@suse.de + +- update to snapshot 2.91.2002012811 + +------------------------------------------------------------------- +Sun Jan 27 16:47:04 CET 2002 - schwab@suse.de + +- Remove invalid use of PAGE_SHIFT. + +------------------------------------------------------------------- +Wed Jan 23 00:46:05 CET 2002 - adrian@suse.de + +- update to snapshot 2.91.2002012221 +- move all distribution version depending configure stuff + to kdebase3-SuSE + +------------------------------------------------------------------- +Wed Jan 16 14:39:09 CET 2002 - adrian@suse.de + +- really fix the kde start link + +------------------------------------------------------------------- +Tue Jan 15 18:29:37 CET 2002 - adrian@suse.de + +- update to snapshot 2.91.2002011511 +- fix kde start link for 7.3.99 development version + +------------------------------------------------------------------- +Tue Jan 8 17:34:22 CET 2002 - adrian@suse.de + +- use current CVS snapshot +- disable rpath linking depending on kdelibs + +------------------------------------------------------------------- +Tue Dec 18 01:01:14 CET 2001 - adrian@suse.de + +- update to version 2.91 (3.0 beta1) + +------------------------------------------------------------------- +Tue Dec 4 20:14:18 CET 2001 - adrian@suse.de + +- use current cvs snapshot + +------------------------------------------------------------------- +Fri Nov 2 12:32:18 CET 2001 - adrian@suse.de + +- using cvs snapshot from 01 Nov. 2001 + ( compiles again with qt 3 final ) + +------------------------------------------------------------------- +Tue Sep 25 19:08:50 CEST 2001 - adrian@suse.de + +- remove a part of setuid-kdm patch, which caused hanging and + killing a bit too much processes +- added diff to avoid killing arbitrary processes + +------------------------------------------------------------------- +Mon Sep 24 10:50:04 CEST 2001 - adrian@suse.de + +- add setuid-kdm patch (SECURITY FIX) +- remove export $LANGUAGE from startkde +- remove testing patch from kdm +- fix KOffice icon really +- add fixes for IconDialog in kmenuedit and kicker + (all icons are back) + +------------------------------------------------------------------- +Fri Sep 21 17:17:30 CEST 2001 - adrian@suse.de + +- fix icon positions again +- change ktip picture +- add dcopserver_shutdown also before a new session is started + (no more login problems;) +- kdm greeter will do not cover xconsole anymore +- fix kcmkdm to use the right kdmrc file (and not to remove the link) +- fix SuSEconfig.kdm2 for security non-easy mode ("NoStars"->"NoEcho") +- fix Home/End keys in konsole _really_ +- fix SegFault in audiocd+lame after first title +- add some last fixes for kdm (thanks a lot, ossi) +- fix ksysguardd start script (kill only, if pid file present) +- change koffice icon from unkown->xedit + +------------------------------------------------------------------- +Thu Sep 20 23:00:34 CEST 2001 - adrian@suse.de + +- add dcopserver_shutdown from HEAD branch and call it in startkde + +------------------------------------------------------------------- +Thu Sep 20 18:41:33 CEST 2001 - adrian@suse.de + +- add fix for wrong ownership of $HOME/.wmrc + +------------------------------------------------------------------- +Thu Sep 20 12:37:43 CEST 2001 - adrian@suse.de + +- change icon for kwintv template + +------------------------------------------------------------------- +Wed Sep 19 00:18:35 CEST 2001 - mfabian@suse.de + +- fix for bug #10464: + make Japanese input possible even when UNIX-style application + shortcuts are selected (Japanese input becomes impossible + when the keyboard shortcut for "SelectAll" is empty. This + workaround sets it to "Alt+Ctrl+Shift+A" instead). +- patch for kpersonalizer to handle encoding as well + +------------------------------------------------------------------- +Tue Sep 18 15:24:30 CEST 2001 - adrian@suse.de + +- add signal handler fix for smbro: +- revert patch for konsole, which breaks the Home/End keys +- minor theme improvements +- add fixes kcontrol: + * size for YaST2 + * broken about page for Menus with sub folders + * rename Modify button to root button + +------------------------------------------------------------------- +Wed Sep 12 13:47:54 CEST 2001 - adrian@suse.de + +- apply cvs branch fix (fix icon desktop handling) +- improve startkde.devices script for better icon positioning + +------------------------------------------------------------------- +Tue Sep 11 20:03:15 CEST 2001 - adrian@suse.de + +- update to second try of kdebase 2.2.1 tar ball + +------------------------------------------------------------------- +Sat Sep 8 21:00:27 CEST 2001 - adrian@suse.de + +- update to 2.2.1 +- fix sane check for kooka icon +- make the Euro char working again in konsole +- fix CD-R icon on desktop + +------------------------------------------------------------------- +Wed Sep 5 17:01:07 CEST 2001 - adrian@suse.de + +- add kwintv and kooka to start scripts +- fix file conflicts +- apply patch from kukuk: do not show lilo menu on non i386 architectures + +------------------------------------------------------------------- +Tue Sep 4 16:55:46 CEST 2001 - adrian@suse.de + +- update to current KDE_2_2_BRANCH ( 04.09.2001 ) + * konsole fixes again + * translation updates + * audiocd fix for Xing tag writing + * charset define fix in kcontrol title +- fix startkde & SuSEconfig scripts + +------------------------------------------------------------------- +Sun Sep 2 10:46:05 CEST 2001 - adrian@suse.de + +- update to current KDE_2_2_BRANCH ( 02.09.2001 ) + * ksmserver checks disk-space in error handling + * removed startup notification for kpager + * fix x screen savers + * kate fixes + * konsole fixes +- add fallbackAppliation lines to templates +- fix startkde scripts for new theme + +------------------------------------------------------------------- +Wed Aug 29 08:22:56 CEST 2001 - adrian@suse.de + +- fix logo patch + +------------------------------------------------------------------- +Tue Aug 28 12:01:34 CEST 2001 - adrian@suse.de + +- update to current KDE_2_2_BRANCH ( 28.08.2001 ) + * better gui in kcontrol file handling + * konsole fixes + * crash fix for konqueror about:blank + * translation updates +- kdm pam support fix + +------------------------------------------------------------------- +Tue Aug 28 02:24:23 CEST 2001 - adrian@suse.de + +- fix startkde scripts for new theme + +------------------------------------------------------------------- +Mon Aug 27 00:51:40 CEST 2001 - ro@suse.de + +- fix typo in specfile (build-root dir was missing in one place) + +------------------------------------------------------------------- +Sat Aug 25 10:30:24 CEST 2001 - adrian@suse.de + +- update to current KDE_2_2_BRANCH + * several fixes for konsole +- split and cleanup SuSE startkde script +- do not apply kcm modules twice on KDE start + +------------------------------------------------------------------- +Tue Aug 21 18:01:42 CEST 2001 - adrian@suse.de + +- update to current KDE_2_2_BRANCH + * fixes for icon handling on desktop + * konsole fixes and enhencements + * kpersonalizer fixes + * icon cleaning + * several kicker fixes +- dlopen libmp3lame if present +- add README and spec file to compile lame +- obsolete kdebase-i686 until objprelink does work better +- move ksysguardd to /usr/bin/ + +------------------------------------------------------------------- +Mon Aug 6 12:47:43 CEST 2001 - adrian@suse.de + +- update to final 2.2 +- add optimized -i686 package for i386 architecture +- add start scripts for ksysguardd +- add SuSE menu kicker patch + +------------------------------------------------------------------- +Wed Aug 1 16:46:21 CEST 2001 - adrian@suse.de + +- update to 2.2rc1 + +------------------------------------------------------------------- +Fri Jun 29 15:39:23 CEST 2001 - adrian@suse.de + +- 2.2beta1 + +------------------------------------------------------------------- +Mon May 28 10:39:45 CEST 2001 - adrian@suse.de + +- 2.2alpha2 + +------------------------------------------------------------------- +Tue May 22 12:59:22 CEST 2001 - adrian@suse.de + +- switch greeting font in kdm to helvetica +- write correct codec numbers for ja,ko,zh +- fix anti_xsnow_pro_netscape fix + +------------------------------------------------------------------- +Tue May 15 19:16:32 CEST 2001 - adrian@suse.de + +- fix kdialog dialog + +------------------------------------------------------------------- +Tue May 15 18:03:03 CEST 2001 - adrian@suse.de + +- add hack to workaround a segfault from Flash6 plugin +- fix root warning in startkde + +------------------------------------------------------------------- +Mon May 14 19:01:28 CEST 2001 - adrian@suse.de + +- my last try to get the top icons in line + (startkde script changes) + +------------------------------------------------------------------- +Sat May 12 08:18:59 CEST 2001 - adrian@suse.de + +- set rc.config variable back to auto + (the users get a asterix in passwd field by default) +- set konsole keytab to XFree86 3 by default, F-Keys are working now +- change picture in ktip + +------------------------------------------------------------------- +Fri May 11 13:18:15 CEST 2001 - adrian@suse.de + +- fix SuSEconfig.kdm2 for LANG=C +- improve icon positions on desktop + +------------------------------------------------------------------- +Thu May 10 14:26:34 CEST 2001 - adrian@suse.de + +- fix lock up if $LANG is not set +- fix not translated Floppy +- add bookmarks to menu +- add SuSE icon to desktop + +------------------------------------------------------------------- +Mon May 7 22:06:49 CEST 2001 - adrian@suse.de + +- fix permissions in kdebase-conf.tar.bz2 +- big icons on panel only for >1280x1024 +- revert coolo's xsnow hack + (it is summer, netscape is more important and it reduces the load) + (BTW: dpms was also broken by this hack ...) +- check for broken SM entry for kicker in kwin:* +- change KDM_SHUTDOWN default to local + +------------------------------------------------------------------- +Sun May 6 14:11:52 CEST 2001 - adrian@suse.de + +- reorganize startkde script to use old and new mountpoints and + translate application icons on desktop +- update to current KDE_2_1_BRANCH +- fix kdm to use Language from kdmrc and not configuration from root +- fix SuSEconfig.kdm2 to write language depended GreetString +- make kcontrol widther by default for YaST2 +- ignore LastLogin in kdmrc for md5sum +- add own kickerrc for resolution 1024 and more +- fix wmlist handling +- drop libkicker_internal.la to fix crashes as suggested by Waldo +- add public_html link to konqueror tree +- add drives folder to konqueror tree +- fix broken line in proxy.desktop + +------------------------------------------------------------------- +Tue May 1 17:41:08 CEST 2001 - adrian@suse.de + +- kcmshell reposition for YaST2 modules +- use iso-8895-15 to support the EUR + +------------------------------------------------------------------- +Wed Apr 25 00:18:14 CEST 2001 - adrian@suse.de + +- drop sensors support (do it really destroy thinkpads ?, not my ;-) +- add konsole patch from mls for latin9 + +------------------------------------------------------------------- +Mon Apr 23 21:41:12 CEST 2001 - adrian@suse.de + +- use SuSEwizard for setup +- strip leading /media/ for device icons +- cleanup startkde + +------------------------------------------------------------------- +Wed Apr 18 14:34:25 CEST 2001 - adrian@suse.de + +- switch off --enable-final for axp + +------------------------------------------------------------------- +Fri Apr 13 11:23:57 CEST 2001 - adrian@suse.de + +- show currency symbol/Euro() in kcontrol font dialog + +------------------------------------------------------------------- +Wed Apr 11 17:21:08 CEST 2001 - adrian@suse.de + +- fix SuSEconfig.kdm2 +- fix conflicts in sub packages + +------------------------------------------------------------------- +Mon Apr 9 17:30:32 CEST 2001 - adrian@suse.de + +- added dialog box while root login. Hopefully no more magazines + will write about our ugly red standard desktop. + But I do not believe it. +- disable alsa for 7.0-ppc + +------------------------------------------------------------------- +Fri Apr 6 13:21:43 CEST 2001 - adrian@suse.de + +- -O2 for axp + apply NOnostdlib patch (resolve hopefully ppc link problems) + +------------------------------------------------------------------- +Fri Mar 30 01:52:53 CEST 2001 - ro@suse.de + +- neededforbuild fix + +------------------------------------------------------------------- +Thu Mar 29 00:56:47 CEST 2001 - mfabian@suse.de + +- I didn't apply the patch for my last changelog entry correctly. + fixed. + +------------------------------------------------------------------- +Tue Mar 27 21:48:17 CEST 2001 - mfabian@suse.de + +- use correct charset for Japanese, Korean, and Chinese in + "startkde" +- use "default" as the font for Japanese, Korean, and Chinese + in /sbin/conf.d/SuSEconfig.kdm2 +- add "GreetString[ja]" to /opt/kde2/share/config/SuSE/config/kdmrc +- add "windowmanager" to "Provides:" + +------------------------------------------------------------------- +Tue Mar 27 12:08:52 CEST 2001 - ro@suse.de + +- changed neededforbuild <docbkdsl> to <docbook-dsssl-stylesheets> + +------------------------------------------------------------------- +Sat Mar 24 11:52:42 CET 2001 - adrian@suse.de + +- go back to -O0 for ppc + disable cdparanoia support for 6.3 + +------------------------------------------------------------------- +Wed Mar 21 20:55:31 CET 2001 - adrian@suse.de + +- remove QT_XFT=yes from startkde to reduce problems with + NVidia Vanta cards + +------------------------------------------------------------------- +Tue Mar 20 21:57:33 CET 2001 - adrian@suse.de + +- enable -O2 for ppc + +------------------------------------------------------------------- +Tue Mar 20 18:53:25 CET 2001 - adrian@suse.de + +- update to 2.1.1 (official tar ball) + +------------------------------------------------------------------- +Tue Mar 20 14:53:56 CET 2001 - adrian@suse.de + +- add feature to kicker (SuSE menu as main menu now possible) + +------------------------------------------------------------------- +Mon Mar 19 22:12:11 CET 2001 - adrian@suse.de + +- fix patches again :-( + +------------------------------------------------------------------- +Sun Mar 18 18:43:10 CET 2001 - adrian@suse.de + +- fix patches + +------------------------------------------------------------------- +Sat Mar 17 14:22:54 CET 2001 - adrian@suse.de + +- update to current 2_1_BRANCH + +------------------------------------------------------------------- +Thu Mar 15 18:23:12 CET 2001 - ro@suse.de + +- changed neededforbuild <mesaglu> to <xf86glu> +- changed neededforbuild <mesaglu-devel> to <xf86glu-devel> + +------------------------------------------------------------------- +Thu Mar 15 01:08:35 CET 2001 - ro@suse.de + +- fixed neededforbuild for openldap + +------------------------------------------------------------------- +Tue Mar 13 10:06:50 CET 2001 - ro@suse.de + +- removed second occurence of docbk30 from neededforbuild + +------------------------------------------------------------------- +Tue Mar 13 01:12:28 CET 2001 - ro@suse.de + +- changed neededforbuild <docbk30> to <docbook_3> + +------------------------------------------------------------------- +Wed Mar 7 16:58:40 CET 2001 - ro@suse.de + +- changed neededforbuild <mesadev> to <mesa-devel> + +------------------------------------------------------------------- +Wed Feb 28 17:38:47 CET 2001 - schwab@suse.de + +- kcontrol: Use getpagesize() to determine page size. + +------------------------------------------------------------------- +Tue Feb 27 11:20:53 CET 2001 - ro@suse.de + +- changed neededforbuild <cyrus-sasl> to <cyrus-sasl cyrus-sasl-devel> + +------------------------------------------------------------------- +Wed Feb 21 18:15:39 CET 2001 - adrian@suse.de + +- update to final 2.1.0 + +------------------------------------------------------------------- +Mon Feb 19 14:38:11 CET 2001 - adrian@suse.de + +- update to 2.1 post beta 2 + +------------------------------------------------------------------- +Wed Jan 24 15:18:37 CET 2001 - adrian@suse.de + +- fix konsole for non iso8859-1 + add Mozilla to desktop, if Netscape is not installed + make SuSEconfig.kdm2 output nicer + a little bit heigher welcome screen + +------------------------------------------------------------------- +Mon Jan 22 18:13:46 CET 2001 - adrian@suse.de + +- fix maximize button in SuSE decoration + +------------------------------------------------------------------- +Mon Jan 22 15:45:55 CET 2001 - adrian@suse.de + +- set nr of mixer in kcontrol to 1 bye default, this fix the + error lines in xconsole +- fix not translated icons on desktop + +------------------------------------------------------------------- +Wed Jan 17 17:40:28 CET 2001 - adrian@suse.de + +- changed kcheckpass to setgroudid shadow instead of setuserid root + add kinternet call to startkde + fixed web font sizes + fixed kde menu icons + fixed non iso-8859-1 language support + +------------------------------------------------------------------- +Wed Jan 17 11:13:54 CET 2001 - adrian@suse.de + +- fix locolor config for standard user and root user settings + +------------------------------------------------------------------- +Mon Jan 15 19:07:42 CET 2001 - adrian@suse.de + +- fix info service + +------------------------------------------------------------------- +Mon Jan 15 13:31:24 CET 2001 - adrian@suse.de + +- fix welcome page size for resolutions>1152 + switch to small desktop font, which looks better + fix czech trash bin name on desktop + update logo on desktop + +------------------------------------------------------------------- +Sun Jan 14 17:12:46 CET 2001 - adrian@suse.de + +- fix hang in SuSEconfig.kdm2, when REAL_LANG is empty + +------------------------------------------------------------------- +Sat Jan 13 18:52:49 CET 2001 - adrian@suse.de + +- fix fallback icon for applications in kicker + fix welcome page start (does not start anymore in second login) + fix SuSE decoration close function from menu + +------------------------------------------------------------------- +Fri Jan 12 11:31:41 CET 2001 - adrian@suse.de + +- new tar ball from KDE_2_0_BRANCH (fix ksysguard bug) + change kcontrol root button label + a little work on the logo + fix rc.config template + fix $LANG problem in welcome page startup + +------------------------------------------------------------------- +Thu Jan 11 23:16:43 CET 2001 - adrian@suse.de + +- changed logo + changed inactive text color in window header + +------------------------------------------------------------------- +Thu Jan 11 10:11:55 CET 2001 - adrian@suse.de + +- delete debug lines in SuSEconfig.kdm2 (cause a hang) + +------------------------------------------------------------------- +Wed Jan 10 17:11:15 CET 2001 - adrian@suse.de + +- fix SuSEconfig.kdm2 for czech people + workaround KDE bug in charset selection via script + fix startkde function for suppress double desktop icons + +------------------------------------------------------------------- +Tue Jan 9 21:21:53 CET 2001 - adrian@suse.de + +- fix welcome page start + fix bg colors. 220,220,220 again. + added security fix for kdesud from Waldo + +------------------------------------------------------------------- +Sun Jan 7 16:44:24 CET 2001 - adrian@suse.de + +- fix update problems due to changed icon handling + +------------------------------------------------------------------- +Sun Jan 7 14:55:50 CET 2001 - adrian@suse.de + +- change icon handling + +------------------------------------------------------------------- +Thu Jan 4 15:58:53 CET 2001 - adrian@suse.de + +- changes in SuSE theme + workaround slow mouse acceleration from XFree 4 + added fix for stolen focus in kdm (Thanks Waldo) + fix ktip start on every KDE start + do not set $LANG new anymore, since kdelibs are fixed + new tar ball with Kernel 2.4 fix in ksysguard (Thanks Chris) + +------------------------------------------------------------------- +Tue Jan 2 21:54:08 CET 2001 - adrian@suse.de + +- font handling fix for AA (thanks Kurt) + +------------------------------------------------------------------- +Mon Jan 1 19:59:35 CET 2001 - adrian@suse.de + +- add kdm resize patch for little resolutions + fix SuSEconfig.kdm2 for languages with no defined charsets + set $LANG for KDE 2 in startkde (for a desktop with native language) + +------------------------------------------------------------------- +Sat Dec 30 20:05:15 CET 2000 - adrian@suse.de + +- fixed two .desktop files for kcontrol + minor fix in startkde + new version of SuSE decoration + +------------------------------------------------------------------- +Fri Dec 22 11:19:45 CET 2000 - adrian@suse.de + +- switch off the X11 resource manager by default + set TERM=kvt for konsole (several Keys like Pos1 are working now) + minor fix in startkde + +------------------------------------------------------------------- +Wed Dec 20 18:38:54 CET 2000 - adrian@suse.de + +- fix SuSEconfig.kdm2 for non iso-8859-1 + added option to disable SuSE theme + added --SuSE function to ksplash + added kdm sec patch from waldo + +------------------------------------------------------------------- +Mon Dec 18 16:13:24 CET 2000 - adrian@suse.de + +- make symbol labels nicer + do not show double icons + added rc.config entrys for kdm + +------------------------------------------------------------------- +Sun Dec 10 23:15:40 CET 2000 - adrian@suse.de + +- extend startkde for dvd and cdrecorder + added logo background mode + changed kicker configuration + fixed line up function for icons on root window + enabled Mesa support again + +------------------------------------------------------------------- +Sat Dec 9 12:49:12 CET 2000 - adrian@suse.de + +- fixing startkde and working on the SuSE theme + +------------------------------------------------------------------- +Wed Dec 6 12:48:53 MET 2000 - adrian@suse.de + +- fixed kde link + +------------------------------------------------------------------- +Wed Nov 29 23:03:42 CET 2000 - adrian@suse.de + +- update to 2.0.1 + +------------------------------------------------------------------- +Tue Nov 21 09:20:25 CET 2000 - ro@suse.de + +- switch to openmotif + +------------------------------------------------------------------- +Tue Nov 21 00:10:43 CET 2000 - adrian@suse.de + +- moved non kde icon support to kdelibs + added drive icon creation to startkde + +------------------------------------------------------------------- +Fri Nov 17 15:15:26 CET 2000 - adrian@suse.de + +- fixed kdm + +------------------------------------------------------------------- +Fri Nov 17 14:57:54 CET 2000 - ro@suse.de + +- fixed neededforbuild: += libmng-devel + +------------------------------------------------------------------- +Thu Nov 16 15:51:08 CET 2000 - adrian@suse.de + +- update to newer snapshot from KDE_2_0_BRANCH + +------------------------------------------------------------------- +Fri Nov 3 08:54:32 CET 2000 - adrian@suse.de + +- fixed needed for build + +------------------------------------------------------------------- +Thu Nov 2 20:40:00 CET 2000 - adrian@suse.de + +- fixed file list + +------------------------------------------------------------------- +Tue Oct 17 05:36:10 CEST 2000 - adrian@suse.de + +- update to 2.0.0 +- added SuSE decoration +- splitted package into + * kdebase + * kdebase-devel + +------------------------------------------------------------------- +Tue Sep 12 08:58:16 CEST 2000 - adrian@suse.de + +- update to RC 1 + +------------------------------------------------------------------- +Mon Aug 21 16:49:08 CEST 2000 - adrian@suse.de + +- update to beta 4 / 1.93 + +------------------------------------------------------------------- +Mon Jul 31 17:10:27 CEST 2000 - adrian@suse.de + +- added workaround for localized startup + (KDE2 can not handle aliases) + +------------------------------------------------------------------- +Mon Jul 24 18:00:53 CEST 2000 - adrian@suse.de + +- update to second try of beta 3 + +------------------------------------------------------------------- +Fri Jul 21 22:54:34 CEST 2000 - adrian@suse.de + +- update to beta 3 + +------------------------------------------------------------------- +Mon Jul 17 19:27:38 CEST 2000 - adrian@suse.de + +- update to snapshot from 17.07.2000 + +------------------------------------------------------------------- +Thu Jul 13 22:58:33 CEST 2000 - adrian@suse.de + +- fixed really the filelist + +------------------------------------------------------------------- +Wed Jul 12 11:37:22 CEST 2000 - adrian@suse.de + +- fixed filelist and fix for older distris + +------------------------------------------------------------------- +Mon Jul 10 17:30:49 CEST 2000 - adrian@suse.de + +- fix start script + +------------------------------------------------------------------- +Mon Jul 10 08:05:46 CEST 2000 - adrian@suse.de + +- update to snapshot from 06.07.2000 + +------------------------------------------------------------------- +Sun Jun 11 12:23:21 CEST 2000 - adrian@suse.de + +- added netscape plugin support + +------------------------------------------------------------------- +Fri Jun 9 17:16:56 CEST 2000 - adrian@suse.de + +- added workarounds in startkde + +------------------------------------------------------------------- +Fri Jun 9 08:03:53 CEST 2000 - adrian@suse.de + +- update to 1.91; beta 2 + +------------------------------------------------------------------- +Sun May 28 09:24:03 CEST 2000 - adrian@suse.de + +- snapshot from 28.05.2000 + new type of spec file + +------------------------------------------------------------------- +Fri May 12 18:09:02 CEST 2000 - adrian@suse.de + +- update to 1.90 + +------------------------------------------------------------------- +Thu Apr 27 18:25:40 CEST 2000 - adrian@suse.de + +- snapshot from 25.04.2000 + +------------------------------------------------------------------- +Wed Apr 19 17:19:28 CEST 2000 - adrian@suse.de + +- snapshot from 17.04.2000 + +------------------------------------------------------------------- +Fri Mar 31 17:05:43 CEST 2000 - adrian@suse.de + +- the first KDE 2 snapshot. still PRE 1.90 + diff --git a/opensuse/core/tdebase/tdebase.fillup b/opensuse/core/tdebase/tdebase.fillup new file mode 100644 index 000000000..d2e2beeb8 --- /dev/null +++ b/opensuse/core/tdebase/tdebase.fillup @@ -0,0 +1,25 @@ +## Type: yesno +## Default: no +## Path: Desktop/KDE +## Description: KDE uses fam support +# +# KDE use the fam daemon +# (makes only sense on NFS mounted directorys) +# +KDE_USE_FAM="no" + +## Type: string +## Default: +# +# space separated list of users for which icons should be shown in KDM +# if empty, then take system defaults +# +KDM_USERS="" + +## Type: string +## Default: +# +# Special greeting words in kdm +# +KDM_GREETSTRING="" + diff --git a/opensuse/core/tdebase/tdebase.spec b/opensuse/core/tdebase/tdebase.spec new file mode 100644 index 000000000..1d37c16ca --- /dev/null +++ b/opensuse/core/tdebase/tdebase.spec @@ -0,0 +1,1659 @@ +# +# spec file for package tdebase (version 3.5.13) +# +# copyright (c) 2011 the Trinity Project +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. +# +# Please submit bugfixes or comments to http://bugs.trinitydesktop.org/ + +# norootforbuild + +Name: tdebase +BuildRequires: OpenEXR-devel cups-devel db-devel doxygen graphviz tdelibs-devel krb5-devel libsmbclient-devel mDNSResponder-devel openldap2 openldap2-devel openmotif openmotif-devel openslp-devel openssh pam-devel pcsc-lite-devel qt3-devel-doc samba-client utempter xorg-x11 +BuildRequires: libtqt4-devel tde-filesystem cmake xorg-x11-libfontenc-devel +BuildRequires: liblazy-devel +BuildRequires: libusb-compat-devel +BuildRequires: fdupes libbz2-devel +BuildRequires: libsensors4-devel +%define qt_path /usr/lib/qt3 +%define kde_path %{_tde_prefix} +Provides: windowmanager kfontinst kdebase3-konqueror kdebase3-khotkeys +Obsoletes: kfontinst kdebase3-konqueror kdebase3-khotkeys +Requires: tdelibs >= %( echo `rpm -q --queryformat '%{VERSION}' tdelibs`) +Requires: xorg-x11 misc-console-font +Recommends: tdelibs_doc +Recommends: gdb +PreReq: fileshareset +%define fileshare_prefix %{_prefix} +PreReq: /bin/sh fileutils permissions +License: GPLv2+ +Group: System/GUI/TDE +Summary: The Trinity Desktop Core Components +BuildRoot: %{_tmppath}/%{name}-%{version}-build +URL: http://www.trinitydesktop.org/ +Version: 3.5.13 +Release: 1 +Requires: %{name}-runtime == %{version} +Source0: tdebase-%{version}.tar.bz2 +Source1: baselibs.conf +Source3: startkde.suse.sh +Source4: tdebase.fillup +Source6: ksysguardd.init +# we append this file for older dist verions +Source8: mp3-info.tar.bz2 +Source9: wizard_small.png +# kicker gets messed up, if it got deinstalled +Source11: kickerrc +# from HEAD/3.2: +Source12: console8x16.pcf.gz +Source13: fileshareset2.tar.bz2 +Source914: kdm-pam-np-legacy +Source15: ksysguardd.reg +Source16: stopkde.suse.sh +Source17: zh_TW.flag.png +Source18: fileshareset.8.gz +Source19: kcheckpass.8.gz +Source20: kickoff-data.tar.bz2 +Source21: kcheckpass-pam-11.1 +Source921: kcheckpass-pam-11.0 +Source9921: kcheckpass-pam-legacy +Source22: bnc.desktop +Source23: sourceforge.desktop +Source24: devmon-automounter.sh +Patch0: 3_5_BRANCH.diff +Patch3: startkde.diff +Patch5: media-iPod.diff +Patch6: ksysguardd-openslp.diff +Patch7: fix-kio-smb-auth.diff +Patch8: konsole_keytab.diff +Patch10: kdesud-security.diff +Patch11: clock-applet-style.diff +Patch12: dont-always-start-kaccess.diff +Patch14: autorun.patch +Patch15: artwork.diff +# TODO +Patch16: kfontinst.diff +Patch17: nsplugin-Preference.diff +Patch20: ksplashml.patch +Patch21: media_suse.diff +Patch22: libkonq-kdemm.diff +Patch39: kdesktop_icons.diff +Patch40: suse_default_move.diff +Patch44: clock-suse-integrate.diff +Patch45: klipperrc.diff +Patch46: lock-xvkbd.diff +Patch51: kcontrol.diff +Patch60: short-menus.diff +# from http://fred.hexbox.de/kde_patches/kmenu-search-fs20050503.diff +Patch61: kmenu-search-fs20050503-fixed.diff +Patch62: fix-kcontrol-yast.diff +Patch63: quick_browser_menu.diff +Patch64: default_fonts.diff +#kdm +Patch69: kdm-cope-with-new-grub.diff +Patch70: kdm-aliasing.diff +Patch71: kdm-mark_autologin.diff +Patch72: kdm-all-users-nopass.diff +Patch74: kdm-sysconfig-values.diff +# svn diff $BASE/branches/KDE/3.5/kdebase/kdm@599257 $BASE/branches/work/coolos_kdm | sed -e "s,^+++ ,+++ kdm/," +Patch75: kdm-make_it_cool.diff +Patch76: kdm-admin-mode.diff +Patch77: kdm-suspend-hal.diff +Patch78: kdm-relaxed-auth.diff +Patch79: kdm-wordbreak.diff +Patch80: non-fast-malloc.diff +Patch81: ksmserver-defaulttohalt.diff +Patch82: fix-lockup-from-gnome-apps.diff +Patch83: ksmserver-suspend.diff +Patch84: default-kdeprintfax.diff +Patch85: ksmserver-tooltips.diff +Patch88: hide-only-showin-entries.diff +Patch92: kcminit-ignore-arts.diff +Patch94: mach_blass.diff +Patch96: khelpcenter-gnome-support.patch +Patch996: khelpcenter-gnome-support-legacy.patch +Patch98: workaround-pdf-on64bit-nsplugin-bug.diff +Patch99: xcursor.diff +Patch100: ksysguard-slp-ratelimit.diff +Patch104: locale-dont-show-flag.diff +Patch105: kscreensaver-random-NG.diff +Patch111: fix_default_theme_reset.diff +Patch114: improve-panelservicemenu-geticonset.diff +Patch116: teach-minicli-lock.diff +Patch117: access.diff +Patch120: kmenu-search-slowdown-fix.diff +Patch123: less_verbal_kdesu.patch +Patch125: kicker-defaults.diff +Patch126: kdebase_khc_rellinks.diff +Patch127: khelpcenter-use-suseconfig-indexer.diff +Patch131: background_default.diff +Patch141: khelpcenter-use-susehelp.diff +Patch144: make-wallpapers-hideable.diff +Patch145: kdebase_networkstatus_branch.diff +Patch149: kdeeject.diff +Patch155: use-full-hinting-by-default.diff +Patch156: kcmshell_use_kde-sound.diff +Patch157: kcmsamba_log.diff +Patch160: khelpcenter-localindices.patch +Patch161: applet-lock-logout.diff +# svn diff $BASE/branches/KDE/3.5/kdebase/kicker@849788 $BASE/branches/work/suse_kickoff_qstyle/kicker | clean_patch +Patch162: kickoff.diff +Patch1629: kickoff-beagle.diff +# svn diff $BASE/branches/KDE/3.5/kdebase/kcontrol/kicker@755866 $BASE/branches/work/suse_kickoff_qstyle/kcontrol/kicker +Patch158: kickoff-kcm.diff +# svn diff -r 551296:HEAD khelpcenter +Patch159: khelpcenter-beagle.diff +Patch163: xinerama.patch +Patch165: optional-compmgr.diff +Patch166: lowdiskspace.patch +Patch167: ksmserver-timed.diff +Patch169: systray_order.diff +Patch170: khotkeys-multimedia-action.diff +Patch171: khotkeys-multimedia-action2.diff +Patch172: select-wm-gui.diff +Patch173: suspend-unmount.diff +Patch174: ksmserver-kdeinit.diff +Patch177: kio-media-errorhandling.diff +Patch179: restore-description-parens.diff +Patch180: kompmgr_use_defaults.diff +Patch189: runupdater.patch +Patch190: kcontrol-energy.diff +Patch195: ioslaveinfo-icon.diff +Patch197: rotate-wacom-pointers.diff +Patch198: konsole-schema-update.diff +Patch199: media-cryptosupport.diff +Patch200: kdm-use-rpmoptflags.diff +Patch203: show-konqueror-in-menu.diff +Patch204: fix-desktop-icons.diff +Patch205: kcmkdm-default-grub.diff +Patch206: simplify-randr-settings.diff +Patch207: spellcheck-default-utf8.diff +Patch208: kdm-audit-log.diff +Patch209: kwinbindings.diff +Patch211: konq-combo-editor.diff +Patch212: minicli-combo-editor.diff +Patch214: kdm-color-scheme.diff +Patch215: kdm-consolekit.diff +Patch216: krandr-0.5.2.1.diff.bz2 +Patch217: kickoff-install-software.diff +Patch218: kdm-align-userlist-labels.diff +Patch219: kxkb-include-latin-layout.diff +Patch220: mediamanager-mount-point-utf8.diff +Patch222: khelpcenter-delayed-indexcheck.cpp +Patch225: system-folder_man.diff +Patch227: arts-start-on-demand.diff +Patch228: media-teardown_crypto.diff +Patch229: beagle-0.3.diff +Patch230: remove-beagle-stuff.diff +Patch231: kde3-session.diff +Patch232: kde3-session-restore.diff +Patch233: uninit.diff +Patch234: kpamgreeter.diff +Patch235: use-pam-before-classic.diff +Patch236: kdesu-remember-keep-password.diff +Patch237: suspend-kpowersave.diff +Patch238: knetattach-show.diff +Patch239: gcc44.diff +Patch240: bnc584223.diff +Patch241: openssl1.patch +Patch242: nsplugin-init-gtk.diff +Patch243: taskbar.patch +Patch244: mtab-reenable.patch + +%description +This package contains tdebase, one of the basic packages of the Trinity Desktop Environment. It contains, among others, kwin (the window +manager), Konqueror (the Web browser), and KControl (the +configuration program) + +This package is needed if you want to use the Trinity Desktop. It is not +needed if you only want to start some Trinity applications. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package -n misc-console-font +License: GPLv2+ +Group: System/GUI/TDE +Summary: A font for terminal usage + +%description -n misc-console-font +This package contains the Misc Console font as shipped with KDE. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package runtime +License: GPLv2+ +Summary: Runtime Dependencies of Trinity Applications +Group: System/GUI/TDE +Provides: kio_fish +Obsoletes: kio_fish +Provides: tdebase:%{_tde_libdir}/libkonq.so.4 + +%description runtime +This package contains runtime dependencies of Trinity applications like +KIO-slaves. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package workspace +License: GPLv2+ +Summary: Workspace Components of Trinity Desktop +Group: System/GUI/TDE +Requires: %{name} == %{version} +Provides: tdebase:%{_tde_bindir}/kicker +Recommends: %{name}-ksysguardd == %{version} + +%description workspace +This package contains the wrkspace components of kdebase3 like +kdesktop, kicker and kwin. + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package apps +License: GPLv2+ +Summary: Trinity's Major Applications +Group: System/GUI/TDE +Requires: %{name} == %{version} +Provides: %{name}:%{_tde_bindir}/konsole + +%description apps +This package contains the major applications kdebase3 like +Kate, Konqueror and KWrite. + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package devel +License: GPLv2+ +Requires: tdelibs-devel %{name} = %{version} %{name}-apps = %{version} %{name}-runtime = %{version} %{name}-workspace = %{version} +Summary: Trinity Base, Build Environment +Group: System/GUI/TDE + +%description devel +This package contains the development files for the Trinity Desktop Environent Base Package, including runtime, workspace, and core applications. + +It is not needed if you do not want to compile high level KDE +applications. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package kdm +License: GPLv2+ +# usesubdirs kdm +Summary: The Trinity login and display manager +Provides: tdebase:%{_tde_bindir}/kdm +Requires: xorg-x11 +Requires: %{name}-runtime >= %version +Group: System/GUI/TDE +PreReq: %fillup_prereq /bin/grep + +%description kdm +This package contains kdm, the login and session manager for Trinity. + +Note that the RC symlink for Trinity's KDM is /usr/sbin/tdm. + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package samba +License: GPLv2+ +# usesubdirs kioslave/smb kcontrol/samba +Summary: Trinity's Windows Connection Module +Group: System/GUI/TDE + +%description samba +This package provides the "smb://" protocol, to connect to and from +Windows and Samba shares. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package extra +License: GPLv2+ +# usesubdirs kpersonalizer kcontrol/thememgr +Summary: Trinity's Extra Applications +Group: System/GUI/TDE + +%description extra +This package contains applications which are usually not needed on +SUSE. + +- kpersonalizer - sets different settings + +- khotkeys aRts support - for voice triggered shortcuts + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package nsplugin +License: GPLv2+ +%ifarch x86_64 +Requires: nspluginwrapper +%endif +Supplements: tdebase >= %version +Requires: tdebase = %version +Summary: Netscape plugin support for Konqueror +Group: System/GUI/TDE + +%description nsplugin +This package contains support for Netscape plug-ins in konqueror. You +have to enable JavaScript for this. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + + +%package ksysguardd +License: GPLv2+ +PreReq: %insserv_prereq %fillup_prereq aaa_base +Summary: Trinity's ksysguard daemon +Group: System/GUI/TDE + +%description ksysguardd +This package contains the ksysguard daemon. It is needed for ksysguard. + +This package can be installed on servers without any other Trinity +packages to guard the system from remote computers. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + + +%package session +License: GPLv2+ +Summary: The Trinity Session +Group: System/GUI/TDE +Provides: tdebase:/usr/bin/tde +Requires: kdebase3-workspace + +%description session +This package contains the startup scripts necessary to start a Trinity +session from the login screen. + + + +Authors: +-------- + Timothy Pearson <kb9vqf@pearsoncomputing.net> + The KDE Team <kde@kde.org> + +%package -n fileshareset +License: GPLv2+ +Summary: Set and list fileshares +Group: System/Management +Version: 2.0 +Release: 579 + +%description -n fileshareset +This package contains the the fieshareset utility to allow users to +add or remove file shares. It's also possible to list currently shared +locations. /etc/security/fileshare.conf is the main configuration file. + + + +Authors: +-------- + Uwe Gansert <uwe.gansert at SuSE dot de> + +%prep +%setup -q -b 8 -b 13 -n tdebase-%{version} +%patch0 +%patch3 +%patch5 +# causes hangs (bnc#158239) +#%patch6 +#%patch100 +%patch7 +%patch8 +%patch10 +%patch11 +%patch12 +%patch14 +# do we really still need it ? +#%patch16 +%patch15 +%patch17 +%patch20 +%patch21 +%patch85 +%patch39 +%patch40 +%patch44 +%patch45 +%patch46 +%patch51 +%patch63 +%patch60 +%patch64 +%patch94 +%patch98 +# all the kdm changes +%patch75 +%patch70 +%patch71 +%patch72 +%patch74 +%patch76 +%patch78 +%patch79 +# default-to-halt +%patch81 +%patch82 +%patch83 +%patch77 +%patch200 +%patch215 +%patch84 +%patch61 +%patch120 +%patch22 +%patch92 +%patch88 +%patch96 +# xcursor +%patch99 +%patch62 +%patch69 +%patch104 +%patch105 +%patch111 +%patch114 +%patch116 +%patch117 +%patch123 +%patch126 +%patch131 +%patch141 -p1 +%patch127 +%patch144 +%patch145 +%patch149 +%patch155 +%patch156 +%patch157 +%patch160 +%patch161 +pushd kicker +%patch162 +pushd ../kcontrol/kicker +%patch158 +popd +popd +%patch165 +%patch166 +%patch167 +tar xvfj %SOURCE20 +%patch163 +%patch125 +%patch169 +%patch170 +%patch171 +%patch172 +%patch173 +%patch174 +%patch177 +%patch179 +%patch180 +%patch189 +%patch190 +%patch195 +%patch198 +%patch199 +%patch203 +%patch204 +%patch205 +%patch207 +%patch208 +%patch209 +%patch211 +%patch212 +%patch214 +pushd kcontrol +%patch216 +popd +%patch217 +%patch218 +%patch219 +%patch220 +%patch222 +%patch225 +%patch197 +%patch206 +%patch227 +%patch228 +%patch231 +%patch232 +%patch233 +%patch234 +%patch235 +%patch236 +%patch237 +%patch238 +%patch239 +%patch240 -p1 +%patch241 -p0 +%patch242 -p0 +%patch243 +%patch244 -p1 + +rm -rf kappfinder +rm pics/crystalsvg/cr??-*emacs.png +cp %SOURCE17 l10n/tw/flag.png +cd ../fileshareset2 +aclocal +autoconf +automake -a -c +cd ../%{name}-%{version} +update_admin + +%build + +%cmake_tde -d build -- -DCMAKE_SKIP_RPATH=OFF \ + -DWITH_HAL=OFF \ + -DWITH_LDAP=ON \ + -DWITH_ARTS=ON \ + -DWITH_SAMBA=ON \ + -DWITH_SASL=ON \ + -DWITH_LIBUSB=ON \ + -DWITH_PAM=ON \ + -DBUILD_ALL=ON + +%make_tde -d build + +cd ../fileshareset2 + ./configure --prefix=%{fileshare_prefix} + make %{?_smp_mflags} + +%install +# relabel smb icon +grep -v ^Icon= kioslave/smb/smb-network.desktop | grep -v ^Name > w +mv w kioslave/smb/smb-network.desktop +echo "Icon=samba" >> kioslave/smb/smb-network.desktop +echo "Name=SMB Shares" >> kioslave/smb/smb-network.desktop +# install +%makeinstall_tde -d build +rm $RPM_BUILD_ROOT/%{_tde_appsdir}/System/kmenuedit.desktop +rm $RPM_BUILD_ROOT/%{_tde_appsdir}/System/kpersonalizer.desktop +rm $RPM_BUILD_ROOT/%{_tde_appsdir}/Utilities/kpager.desktop +rm $RPM_BUILD_ROOT/%{_tde_appsdir}/Internet/keditbookmarks.desktop +rm $RPM_BUILD_ROOT/%{_tde_appsdir}/Toys/ktip.desktop +install -m 0644 %SOURCE12 $RPM_BUILD_ROOT/%{_tde_sharedir}/fonts/ +install -D -m 0644 %SOURCE21 $RPM_BUILD_ROOT/etc/pam.d/kcheckpass +install -m 0644 %SOURCE22 $RPM_BUILD_ROOT/%{_tde_servicesdir}/searchproviders/ +install -m 0644 %SOURCE23 $RPM_BUILD_ROOT/%{_tde_servicesdir}/searchproviders/ +mkdir -p ${RPM_BUILD_ROOT}/%{_bindir} \ + ${RPM_BUILD_ROOT}/%{_sbindir} \ + ${RPM_BUILD_ROOT}/var/run/xdmctl +ln -fs %{_tde_bindir}/startkde $RPM_BUILD_ROOT/usr/bin/tde +ln -fs %{_tde_bindir}/startkde $RPM_BUILD_ROOT/usr/bin/starttde +ln -sf rcxdm ${RPM_BUILD_ROOT}/usr/sbin/rctdm +mv ${RPM_BUILD_ROOT}/%{_tde_bindir}/ksysguardd ${RPM_BUILD_ROOT}/%{_bindir}/ksysguardd +ln -sf %{_bindir}/ksysguardd ${RPM_BUILD_ROOT}/%{_tde_bindir}/ksysguardd +install -d ${RPM_BUILD_ROOT}/%{_tde_prefix}/env +install -D -m 0755 %SOURCE16 ${RPM_BUILD_ROOT}/%{_tde_prefix}/shutdown/stopkde.suse.sh +mkdir -p "${RPM_BUILD_ROOT}"/etc/security/ +echo "RESTRICT=yes" > "${RPM_BUILD_ROOT}"/etc/security/fileshare.conf +# +# install pixmaps and configuration +# +mkdir -p $RPM_BUILD_ROOT/var/adm/fillup-templates +mkdir -p $RPM_BUILD_ROOT/etc/init.d/ +install -m 0644 %SOURCE9 ${RPM_BUILD_ROOT}/%{_tde_datadir}/kdewizard/pics/wizard_small.png +install -m 0744 %SOURCE6 $RPM_BUILD_ROOT/etc/init.d/ksysguardd +mkdir -p $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/faces/ +ln -s ../pics/users/root1.png $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/faces/root.face.icon +ln -s ../pics/users/default2.png $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/faces/.default.face.icon +ln -sf /etc/init.d/ksysguardd $RPM_BUILD_ROOT/%{_sbindir}/rcksysguardd +install -D -m 644 %SOURCE15 $RPM_BUILD_ROOT/etc/slp.reg.d/ksysguardd.reg +# even if we use smbro +install -D -m 644 kioslave/smb/smb-network.desktop $RPM_BUILD_ROOT/{%{_tde_datadir}/konqueror/dirtree/remote/smb-network.desktop +# +# install kde session file +# +install -m 0755 -d $RPM_BUILD_ROOT/usr/share/xsessions/ +mv $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/sessions/tde.desktop $RPM_BUILD_ROOT/usr/share/xsessions/ +# for those we have a package for remove the backup and rely on the package +for wm in gnome xfce4 xfce wmaker blackbox fvwm95 fvwm icewm enlightenment; do + rm -f $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/sessions/$wm.desktop +done +%suse_update_desktop_file $RPM_BUILD_ROOT/usr/share/xsessions/tde.desktop +# +# delete unwanted/double files +# +rm $RPM_BUILD_ROOT/%{_tde_datadir}/kdesktop/DesktopLinks/Home.desktop +rm $RPM_BUILD_ROOT/%{_tde_datadir}/kdesktop/DesktopLinks/System.desktop +rm $RPM_BUILD_ROOT/%{_tde_iconsdir}/*/*/apps/kvirc.* +mkdir -p $RPM_BUILD_ROOT/%{_datadir} +mv $RPM_BUILD_ROOT/%{_tde_wallpapersdir} $RPM_BUILD_ROOT/%{_datadir} +cd ../fileshareset2/src +rm -f $RPM_BUILD_ROOT/%{_tde_bindir}/fileshare{set,list} +make DESTDIR=$RPM_BUILD_ROOT install +chmod 0755 $RPM_BUILD_ROOT/%{fileshare_prefix}/bin/fileshareset +cd .. +FILLUP_DIR=$RPM_BUILD_ROOT/var/adm/fillup-templates +install -m 644 -D %SOURCE4 $FILLUP_DIR/sysconfig.windowmanager-tdebase +mkdir -p $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/{16x16,22x22,32x32,48x48,64x64,128x128}/apps/ + +for i in {16,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/mimetypes/misc.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmcomponentchooser.png;done + +for i in {16,22,32,48,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/launch.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmperformance.png;done + +cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/16x16/actions/services.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/16x16/apps/kcmkded.png + +for i in {16,22,32,48}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/exit.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmsmserver.png;done + +for i in {16,22,32}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/spellcheck.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmspellchecking.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/filesystems/desktop.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmdesktopbehavior.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/filesystems/desktop.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmdesktop.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/apps/kmenu.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmtaskbar.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/mimetypes/colorscm.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmcolors.png;done + +for i in {16,22,32,48,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/launch.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmlaunch.png;done + +for i in {16,22,32}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/filter.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmkhtml_filter.png;done + +for i in {16,22,32}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/run.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmcgi.png;done + +for i in {16,22}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/history.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmhistory.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/filesystems/network.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmnetpref.png;done + +for i in {16,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/devices/blockdevice.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmkdnssd.png;done + +for i in {16,22,32,48,64}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/devices/joystick.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmjoystick.png;done + +for i in {16,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/devices/mouse.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmmouse.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/devices/system.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmmedia.png;done + +for i in {16,22,32}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/actions/encrypted.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmcrypto.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/filesystems/trashcan_empty.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmprivacy.png;done + +for i in {16,22,32,48,64,128}; do cp %{buildroot}/%{_tde_iconsdir}/crystalsvg/"$i"x"$i"/filesystems/network.png $RPM_BUILD_ROOT/%{_tde_iconsdir}/hicolor/"$i"x"$i"/apps/kcmnic.png;done +# +# solve file conflicts with theme packages ... +# +mv $RPM_BUILD_ROOT/%{_tde_datadir}/ksplash/pics $RPM_BUILD_ROOT/%{_tde_datadir}/ksplash/pics-default +ln -s pics-default $RPM_BUILD_ROOT/%{_tde_datadir}/ksplash/pics +chmod 0755 $RPM_BUILD_ROOT/%{fileshare_prefix}/bin/fileshareset +%suse_update_desktop_file kate TextEditor +%suse_update_desktop_file kwrite TextEditor +%suse_update_desktop_file Help Documentation Viewer +%suse_update_desktop_file Home System FileManager core +%suse_update_desktop_file KControl X-SuSE-core +%suse_update_desktop_file konqbrowser WebBrowser +%suse_update_desktop_file Kfind System Filesystem core +%suse_update_desktop_file kinfocenter System Monitor +%suse_update_desktop_file kmenuedit Core-Configuration +%suse_update_desktop_file konsole TerminalEmulator +%suse_update_desktop_file konsolesu TerminalEmulator +%suse_update_desktop_file ksysguard System Monitor +%suse_update_desktop_file -r klipper System TrayIcon +%suse_update_desktop_file kpager Utility DesktopUtility +%suse_update_desktop_file -u ktip System Utility +%suse_update_desktop_file konqfilemgr System FileManager +%suse_update_desktop_file konquerorsu System FileManager +%suse_update_desktop_file kdeprintfax PrintingUtility +%suse_update_desktop_file kjobviewer PrintingUtility +%suse_update_desktop_file kpersonalizer DesktopUtility +%suse_update_desktop_file kcmkicker X-KDE-settings-desktop +%suse_update_desktop_file knetattach System Network +%suse_update_desktop_file -r kfontview Graphics Viewer +%suse_update_desktop_file -r krandrtray Applet X-KDE-settings-desktop +%suse_update_desktop_file $RPM_BUILD_ROOT/%{_tde_datadir}/remoteview/smb-network.desktop +for i in $RPM_BUILD_ROOT/%{_tde_appsdir}/System/ScreenSavers/*.desktop ; do + sed -e '/^\[Desktop Entry\]/a\ +Categories=Screensaver;' $i > ${i}_ + mv ${i}_ $i + %suse_update_desktop_file "$i" +done +install -d $RPM_BUILD_ROOT/%{_tde_appsdir}/apps +ln -sf %{_tde_appsdir}/System/ScreenSavers $RPM_BUILD_ROOT/%{_tde_appsdir}/apps/ScreenSavers + +for i in $RPM_BUILD_ROOT/%{_tde_applicationsdir}/kde/*.desktop \ + $RPM_BUILD_ROOT/%{_tde_datadir}/konqueror/servicemenus/*.desktop \ + $RPM_BUILD_ROOT/%{_tde_datadir}/kicker/*/*.desktop \ + $RPM_BUILD_ROOT/%{_tde_datadir}/kicker/*/*/*.desktop \ + $RPM_BUILD_ROOT/%{_tde_datadir}/kicker/*/*/*.desktop \ + $RPM_BUILD_ROOT/%{_datadir}/wallpapers/*.desktop \ + $RPM_BUILD_ROOT/%{_tde_datadir}/konqsidebartng/virtual_folders/services/*.desktop; do + [ "`sed -n '/^\[Desktop Entry\]/,/^\[/ s,NoDisplay=\(.*\),\1,p' "$i"`" = "true" ] && continue + [ "`sed -n '/^\[Desktop Entry\]/,/^\[/ s,Hidden=\(.*\),\1,p' "$i"`" = "true" ] && continue + grep -q X-SuSE-translate "$i" && continue + %suse_update_desktop_file "$i" +done +rm -f $RPM_BUILD_ROOT/%{_tde_configdir}/kdm/README +rm -f $RPM_BUILD_ROOT/%{_tde_datadir}/kdm/sessions/icewm.desktop +# +# gimp 2.0 does have a different named icon +# +for i in $RPM_BUILD_ROOT/%{_tde_iconsdir}/*/*/apps/gimp.png; do + ln "$i" "${i%/*}/wilber-icon.png" +done +mkdir -p -m 755 $RPM_BUILD_ROOT/%_mandir/man8 +cp %SOURCE18 $RPM_BUILD_ROOT/%_mandir/man8 +cp %SOURCE19 $RPM_BUILD_ROOT/%_mandir/man8 +# don't conflict with man pages from KDE4 packages +rm $RPM_BUILD_ROOT/%_mandir/man1/kate.* +rm $RPM_BUILD_ROOT/%_mandir/man1/kdesu.* +rm $RPM_BUILD_ROOT/%_mandir/man1/kbookmarkmerger.* +rm $RPM_BUILD_ROOT/%_mandir/man1/kfind.* +%tde_post_install +%fdupes $RPM_BUILD_ROOT/%{_tde_sharedir} +# move konqueror.desktop back to old position (#281572) +mv $RPM_BUILD_ROOT/%{_tde_applicationsdir}/kde/konqueror.desktop $RPM_BUILD_ROOT/%{_tde_appsdir}/konqueror.desktop + +# while this script uses udisks, it's better to be fully integrated +# into Trinity. +#%if 0%{?with_hal} == 0 +#cp -f %{SOURCE24} $RPM_BUILD_ROOT/opt/kde3/bin +#chmod +x $RPM_BUILD_ROOT/opt/kde3/bin/devmon-automounter.sh +#sed -i 5i\ '/opt/kde3/bin/devmon-automounter.sh &' $RPM_BUILD_ROOT/opt/kde3/bin/startkde +#%endif + +%pre +# we have this as link +if test -e opt/tde/share/apps/ksplash/pics -a ! -L opt/tde/share/apps/ksplash/pics ; + then + if test -e opt/tde/share/apps/ksplash/pics-default; then + rm -rf opt/tde/share/apps/ksplash/pics + else + mv opt/tde/share/apps/ksplash/pics opt/tde/share/apps/ksplash/pics-default + fi +fi +kdmrc=/opt/tde/share/config/kdm/kdmrc +# if the /opt/tde one is obviously wrong and we have one in /etc we move that one over to +# avoid confusion on update what's the right kdmrc +if test -f $kdmrc && grep -q "Session=/opt/tde/share/config/kdm/Xsession" $kdmrc && test -f /etc$kdmrc; then + mv /etc$kdmrc $kdmrc +fi + +%post +/sbin/ldconfig +%run_permissions + +%post kdm +%{fillup_only -an windowmanager-tdebase} +/opt/tde/bin/genkdmconf +if test -f /etc/sysconfig/displaymanager ; then + . /etc/sysconfig/displaymanager +fi +%{fillup_only -n displaymanager -s tdebase-SuSE} +%{remove_and_set -n displaymanager KDM_SHUTDOWN} +if test -n "$KDM_SHUTDOWN" -a "$KDM_SHUTDOWN" != "no"; then + if test "$KDM_SHUTDOWN" = "local" ; then + KDM_SHUTDOWN=all + fi + case "$KDM_SHUTDOWN" in + "auto" | "none" | "root") + sed -i -e "s/^DISPLAYMANAGER_SHUTDOWN=.*/DISPLAYMANAGER_SHUTDOWN=\"$KDM_SHUTDOWN\"/" /etc/sysconfig/displaymanager + ;; + esac +fi + +%post -n fileshareset +%run_permissions + +%postun kdm +%insserv_cleanup + +%postun +%insserv_cleanup +/sbin/ldconfig + +%post runtime -p /sbin/ldconfig + +%postun runtime -p /sbin/ldconfig + +%post workspace -p /sbin/ldconfig + +%postun workspace -p /sbin/ldconfig + +%post apps -p /sbin/ldconfig + +%postun apps -p /sbin/ldconfig + +%clean +rm -rf $RPM_BUILD_ROOT + +%files -n misc-console-font +%defattr(-,root,root) +%doc COPYING +%{_tde_sharedir}/fonts/console8x16.pcf.gz + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING README README.pam ../lame.spec ../README.mp3 +%exclude %{_tde_sharedir}/fonts/console8x16.pcf.gz +%dir %{_tde_iconsdir}/hicolor/* +%dir %{_tde_libdir}/kconf_update_bin +%dir %{_tde_datadir}/plugin +%dir %{_tde_appsdir} +%dir %{_tde_appsdir}/Settings +%dir %{_tde_appsdir}/Settings/WebBrowsing +%dir %{_tde_appsdir}/System/ScreenSavers +%dir %{_tde_appsdir}/apps +%{_tde_appsdir}/apps/ScreenSavers +/etc/xdg/menus/*.menu +/etc/xdg/menus/applications-merged +%verify(not mode) %attr(2755,root,nogroup) %{_tde_bindir}/kdesud +%verify(not mode) %attr(0755,root,man) %{_tde_bindir}/khc_indexbuilder +%{_tde_prefix}/env +%{_tde_bindir}/arts-start +%{_tde_bindir}/drkonqi +%{_tde_bindir}/kaccess +%{_tde_bindir}/kblankscrn.kss +%{_tde_bindir}/kbookmarkmerger +%{_tde_bindir}/kcminit +%{_tde_bindir}/kcminit_startup +%{_tde_modulesdir}/kcminit_startup.* +%{_tde_bindir}/kcontrol* +%{_tde_bindir}/kdeinstallktheme +%{_tde_bindir}/kdepasswd +%{_tde_bindir}/kdcop +%{_tde_bindir}/kdebugdialog +%{_tde_bindir}/kdeeject +%{_tde_bindir}/kdeprintfax +%{_tde_bindir}/keditfiletype +%{_tde_bindir}/khelpcenter +%{_tde_bindir}/kjobviewer +%{_tde_bindir}/kcheckrunning +%{_tde_bindir}/kpm +%{_tde_bindir}/krandom.kss +%{_tde_bindir}/krdb +%{_tde_bindir}/kxkb +%{_tde_bindir}/kdialog +%{_tde_bindir}/klocaldomainurifilterhelper +%{_tde_bindir}/kio_media_mounthelper +%{_tde_bindir}/knetattach +%{_tde_bindir}/ktrash +%{_tde_bindir}/khc_docbookdig.pl +%{_tde_bindir}/khc_mansearch.pl +%{_tde_bindir}/khc_htdig.pl +%{_tde_bindir}/khc_htsearch.pl +%{_tde_bindir}/kapplymousetheme +%{_tde_bindir}/kio_system_documenthelper +%{_tde_bindir}/runupdater +%{_tde_bindir}/kstart +%{_tde_bindir}/ksystraycmd +%{_tde_modulesdir}/cursorthumbnail.* +%{_tde_modulesdir}/htmlthumbnail.* +%{_tde_modulesdir}/imagethumbnail.* +%{_tde_modulesdir}/kcm_a* +%{_tde_modulesdir}/kcm_bell* +%{_tde_modulesdir}/kcm_keyboard* +%{_tde_modulesdir}/kcm_c* +%{_tde_modulesdir}/kcm_d* +%{_tde_modulesdir}/kcm_e* +%{_tde_modulesdir}/kcm_f* +%{_tde_modulesdir}/kcm_h* +%{_tde_modulesdir}/kcm_i* +%{_tde_modulesdir}/kcm_l* +%{_tde_modulesdir}/kcm_nic.* +%{_tde_modulesdir}/kcm_p* +%{_tde_modulesdir}/kcm_smserver.* +%{_tde_modulesdir}/kcm_spellchecking.* +%{_tde_modulesdir}/kcm_style.* +%{_tde_modulesdir}/kcm_usb.* +%{_tde_modulesdir}/khelpcenter.* +%{_tde_modulesdir}/kcm_xinerama.* +%{_tde_modulesdir}/kxkb.* +%{_tde_modulesdir}/djvuthumbnail.* +%{_tde_modulesdir}/kaccess.* +%{_tde_modulesdir}/kcminit.* +%{_tde_modulesdir}/kcm_nsplugins.* +%{_tde_modulesdir}/kcontrol.* +%{_tde_modulesdir}/keditbookmarks.* +%{_tde_modulesdir}/kfmclient.* +%{_tde_modulesdir}/kjobviewer.* +%{_tde_modulesdir}/kprinter.* +%{_tde_modulesdir}/libkdeprint_part.* +%{_tde_modulesdir}/libkshorturifilter.* +%{_tde_modulesdir}/libkuri* +%{_tde_modulesdir}/libkonsolepart.* +%{_tde_modulesdir}/textthumbnail.* +%{_tde_modulesdir}/kcm_joystick.* +%{_tde_modulesdir}/kcm_useraccount.* +%{_tde_modulesdir}/kcontroledit.* +%{_tde_modulesdir}/kded_kwrited.* +%{_tde_modulesdir}/kstyle_keramik_config.* +%{_tde_modulesdir}/libkmanpart.* +%{_tde_modulesdir}/liblocaldomainurifilter.* +%{_tde_modulesdir}/runupdater.* +%{_tde_libdir}/libkdeinit_runupdater.so +%{_tde_libdir}/libkdeinit_kaccess.so +%{_tde_libdir}/libkdeinit_kcminit.so +%{_tde_libdir}/libkdeinit_kcminit_startup.so +%{_tde_libdir}/libkdeinit_kcontrol.so +%{_tde_libdir}/libkdeinit_kcontroledit.so +%{_tde_libdir}/libkdeinit_keditbookmarks.so +%{_tde_libdir}/libkdeinit_kfmclient.so +%{_tde_libdir}/libkdeinit_khelpcenter.so +%{_tde_libdir}/libkdeinit_kjobviewer.so +%{_tde_libdir}/libkdeinit_kxkb.so +%{_tde_modulesdir}/libnsplugin.* +%{_tde_modulesdir}/kded_remotedirnotify.* +%{_tde_modulesdir}/kded_systemdirnotify.* +%{_tde_modulesdir}/libkhtmlkttsdplugin.* +%{_tde_modulesdir}/kcm_media.la +%{_tde_modulesdir}/kcm_media.so +%{_tde_modulesdir}/kded_homedirnotify.la +%{_tde_modulesdir}/kded_homedirnotify.so +%{_tde_modulesdir}/kded_medianotifier.la +%{_tde_modulesdir}/kded_medianotifier.so +%{_tde_modulesdir}/kcm_kded.* +%{_tde_modulesdir}/kcm_kdnssd.* +%{_tde_modulesdir}/kcm_keyboard.* +%{_tde_modulesdir}/kcm_keys.* +%{_tde_modulesdir}/kcm_kio.* +%{_tde_modulesdir}/kcm_knotify.* +%{_tde_modulesdir}/kcm_konq.* +%{_tde_modulesdir}/kcm_konqhtml.* +%{_tde_modulesdir}/kcm_kthememanager.* +%{_tde_modulesdir}/kcm_kurifilt.* +%{_tde_applicationsdir}/kde/khtml_filter.desktop +%{_tde_applicationsdir}/kde/media.desktop +%{_tde_applicationsdir}/kde/joystick.desktop +%{_tde_applicationsdir}/kde/kcm_useraccount.desktop +%{_tde_applicationsdir}/kde/kdepasswd.desktop +%{_tde_applicationsdir}/kde/kthememanager.desktop +%{_tde_applicationsdir}/kde/Help.desktop +%{_tde_applicationsdir}/kde/KControl.desktop +%{_tde_applicationsdir}/kde/arts.desktop +%{_tde_applicationsdir}/kde/bell.desktop +%{_tde_applicationsdir}/kde/cache.desktop +%{_tde_applicationsdir}/kde/colors.desktop +%{_tde_applicationsdir}/kde/componentchooser.desktop +%{_tde_applicationsdir}/kde/cookies.desktop +%{_tde_applicationsdir}/kde/crypto.desktop +%{_tde_applicationsdir}/kde/display.desktop +%{_tde_applicationsdir}/kde/dma.desktop +%{_tde_applicationsdir}/kde/ebrowsing.desktop +%{_tde_applicationsdir}/kde/filebrowser.desktop +%{_tde_applicationsdir}/kde/filetypes.desktop +%{_tde_applicationsdir}/kde/fonts.desktop +%{_tde_applicationsdir}/kde/clock.desktop +%{_tde_applicationsdir}/kde/icons.desktop +%{_tde_applicationsdir}/kde/interrupts.desktop +%{_tde_applicationsdir}/kde/installktheme.desktop +%{_tde_applicationsdir}/kde/ioports.desktop +%{_tde_applicationsdir}/kde/ioslaveinfo.desktop +%{_tde_applicationsdir}/kde/kcmaccess.desktop +%{_tde_applicationsdir}/kde/kcmcgi.desktop +%{_tde_applicationsdir}/kde/kcmcss.desktop +%{_tde_applicationsdir}/kde/kcmhistory.desktop +%{_tde_applicationsdir}/kde/kcmkded.desktop +%{_tde_applicationsdir}/kde/kcmlaunch.desktop +%{_tde_applicationsdir}/kde/kcm_kdnssd.desktop +%{_tde_applicationsdir}/kde/kcmnotify.desktop +%{_tde_applicationsdir}/kde/kcmperformance.desktop +%{_tde_applicationsdir}/kde/kcmusb.desktop +%{_tde_applicationsdir}/kde/kdeprintfax.desktop +%{_tde_applicationsdir}/kde/keyboard.desktop +%{_tde_applicationsdir}/kde/keyboard_layout.desktop +%{_tde_applicationsdir}/kde/keys.desktop +%{_tde_applicationsdir}/kde/kfmclient.desktop +%{_tde_applicationsdir}/kde/kfmclient_dir.desktop +%{_tde_applicationsdir}/kde/kfmclient_html.desktop +%{_tde_applicationsdir}/kde/kfmclient_war.desktop +%{_tde_applicationsdir}/kde/khtml_behavior.desktop +%{_tde_applicationsdir}/kde/khtml_fonts.desktop +%{_tde_applicationsdir}/kde/khtml_java_js.desktop +%{_tde_applicationsdir}/kde/khtml_plugins.desktop +%{_tde_applicationsdir}/kde/kjobviewer.desktop +%{_tde_applicationsdir}/kde/lanbrowser.desktop +%{_tde_applicationsdir}/kde/language.desktop +%{_tde_applicationsdir}/kde/memory.desktop +%{_tde_applicationsdir}/kde/mouse.desktop +%{_tde_applicationsdir}/kde/netpref.desktop +%{_tde_applicationsdir}/kde/nic.desktop +%{_tde_applicationsdir}/kde/partitions.desktop +%{_tde_applicationsdir}/kde/pci.desktop +%{_tde_applicationsdir}/kde/printers.desktop +%{_tde_applicationsdir}/kde/privacy.desktop +%{_tde_applicationsdir}/kde/processor.desktop +%{_tde_applicationsdir}/kde/proxy.desktop +%{_tde_applicationsdir}/kde/scsi.desktop +%{_tde_applicationsdir}/kde/smbstatus.desktop +%{_tde_applicationsdir}/kde/sound.desktop +%{_tde_applicationsdir}/kde/spellchecking.desktop +%{_tde_applicationsdir}/kde/style.desktop +%{_tde_applicationsdir}/kde/useragent.desktop +%{_tde_applicationsdir}/kde/xserver.desktop +%{_tde_applicationsdir}/kde/cdinfo.desktop +%{_tde_appsdir}/.hidden +%{_tde_appsdir}/Settings/Information +%{_tde_appsdir}/Settings/LookNFeel +%{_tde_appsdir}/Settings/WebBrowsing/khtml_appearance.desktop +%{_tde_appsdir}/Settings/WebBrowsing/smb.desktop +%{_tde_datadir}/drkonqi +%{_tde_datadir}/kc* +%{_tde_datadir}/kdcop +%{_tde_datadir}/kdeprint* +%{_tde_datadir}/kdewizard +%{_tde_datadir}/kdisplay +%{_tde_datadir}/khelpcenter/searchhandlers/docbook.desktop +%{_tde_datadir}/khelpcenter +%{_tde_datadir}/kio* +%{_tde_datadir}/kjobviewer +%{_tde_datadir}/konsole +%{_tde_datadir}/khtml/kpartplugins +%{_tde_datadir}/kthememanager +%{_tde_datadir}/remoteview +%{_tde_datadir}/systemview +%{_tde_datadir}/kaccess +%{_tde_configdir}.kcfg/klaunch.kcfg +%{_tde_configdir}.kcfg/khelpcenter.kcfg +%{_tde_configdir}.kcfg/keditbookmarks.kcfg +%{_tde_configdir}.kcfg/launcherapplet.kcfg +%{_tde_configdir}.kcfg/mediamanagersettings.kcfg +%{_tde_mimedir}/inode/system_directory.desktop +%{_tde_servicesdir}/kded/remotedirnotify.desktop +%{_tde_servicesdir}/kded/systemdirnotify.desktop +%config(noreplace) %{_tde_configdir}/kshorturifilterrc +%config(noreplace) %{_tde_configdir}/kxkb_groups +%{_tde_sharedir}/desktop-directories +%exclude %{_tde_htmldir}/en/kioslave +%dir %{_tde_sharedir}/fonts +%dir %{_tde_sharedir}/fonts/override +%verify(not md5 size mtime) %{_tde_sharedir}/fonts/override/fonts.dir +%dir %{_tde_iconsdir}/*/*/* +%{_tde_configdir}.kcfg/kcm_useraccount.kcfg +%{_tde_configdir}.kcfg/kcm_useraccount_pass.kcfg +%exclude %{_tde_iconsdir}/*/*/*/style.* +%exclude %{_tde_iconsdir}/*/*/*/looknfeel.* +%exclude %{_tde_iconsdir}/*/*/*/energy.* +%exclude %{_tde_iconsdir}/*/*/*/date.* +%exclude %{_tde_iconsdir}/*/*/*/filetypes.* +%exclude %{_tde_iconsdir}/*/*/*/personal.* +%{_tde_iconsdir}/*/*/*/a*.* +%{_tde_iconsdir}/*/*/*/b*.* +%{_tde_iconsdir}/*/*/*/c*.* +%{_tde_iconsdir}/*/*/*/d*.* +%{_tde_iconsdir}/*/*/*/f*.* +%{_tde_iconsdir}/*/*/*/g*.* +%{_tde_iconsdir}/*/*/*/help_index.* +%{_tde_iconsdir}/*/*/*/icons.* +%{_tde_iconsdir}/*/*/*/input_devices_settings.* +%{_tde_iconsdir}/*/*/*/kcmx.* +%{_tde_iconsdir}/*/*/*/kcmdf.* +%{_tde_iconsdir}/*/*/*/kbinaryclock.* +%{_tde_iconsdir}/*/*/apps/kcmcgi.* +%{_tde_iconsdir}/*/*/apps/kcmcolors.* +%{_tde_iconsdir}/*/*/apps/kcmcomponentchooser.* +%{_tde_iconsdir}/*/*/apps/kcmcrypto.* +%{_tde_iconsdir}/*/*/apps/kcmhistory.* +%{_tde_iconsdir}/*/*/apps/kcmjoystick.* +%{_tde_iconsdir}/*/*/apps/kcmkded.* +%{_tde_iconsdir}/*/*/apps/kcmkdnssd.* +%{_tde_iconsdir}/*/*/apps/kcmkhtml_filter.* +%{_tde_iconsdir}/*/*/apps/kcmlaunch.* +%{_tde_iconsdir}/*/*/apps/kcmmedia.* +%{_tde_iconsdir}/*/*/apps/kcmmouse.* +%{_tde_iconsdir}/*/*/apps/kcmnetpref.* +%{_tde_iconsdir}/*/*/apps/kcmnic.* +%{_tde_iconsdir}/*/*/apps/kcmperformance.* +%{_tde_iconsdir}/*/*/apps/kcmprivacy.* +%{_tde_iconsdir}/*/*/apps/kcmspellchecking.* +%{_tde_iconsdir}/*/*/*/ieee1394.* +%{_tde_iconsdir}/*/*/*/kdeprintfax.* +%{_tde_iconsdir}/*/*/*/kdisknav.* +%{_tde_iconsdir}/*/*/*/knetattach.* +%{_tde_iconsdir}/*/*/*/key_bindings.* +%{_tde_iconsdir}/*/*/*/keyboard_layout.* +%{_tde_iconsdir}/*/*/*/kfm_home.* +%{_tde_iconsdir}/*/*/*/khelpcenter.* +%{_tde_iconsdir}/*/*/*/kjobviewer.* +%{_tde_iconsdir}/*/*/*/konsole.* +%{_tde_iconsdir}/*/*/*/l*.* +%{_tde_iconsdir}/*/*/*/m*.* +%{_tde_iconsdir}/*/*/*/ne*.* +%{_tde_iconsdir}/*/*/*/opera.* +%{_tde_iconsdir}/*/*/*/r*.* +%{_tde_iconsdir}/*/*/*/s*.* +%{_tde_iconsdir}/*/*/*/usb.* +%{_tde_iconsdir}/*/*/*/vnc.* +%{_tde_iconsdir}/*/*/*/w*.* +%{_tde_iconsdir}/*/*/*/e*.* +%{_tde_iconsdir}/*/*/*/kcmdevices.* +%{_tde_iconsdir}/*/*/*/kcmdrkonqi.* +%{_tde_iconsdir}/*/*/*/kcmmemory.* +%{_tde_iconsdir}/*/*/*/kcmmidi.* +%{_tde_iconsdir}/*/*/*/kcmpartitions.* +%{_tde_iconsdir}/*/*/*/kcmpci.* +%{_tde_iconsdir}/*/*/*/kcmprocessor.* +%{_tde_iconsdir}/*/*/*/kcmscsi.* +%{_tde_iconsdir}/*/*/*/kthememgr.* +%{_tde_iconsdir}/*/*/*/kcontrol.* +%{_tde_iconsdir}/*/*/*/kxkb.* +%{_tde_iconsdir}/*/*/*/p*.* +%{_tde_iconsdir}/*/*/*/t*.* +%{_tde_iconsdir}/*/*/*/qtella.* +%{_tde_iconsdir}/*/*/*/x*.* +# these have no PNG +%{_tde_iconsdir}/*/scalable/apps/hardware.svgz +%{_tde_iconsdir}/*/scalable/apps/kate2.svgz +%{_tde_iconsdir}/*/scalable/apps/kwrite2.svgz +%{_tde_iconsdir}/*/scalable/apps/openoffice.svgz +%{_tde_iconsdir}/*/scalable/apps/quicktime.svgz +%{_tde_sharedir}/locale +%{_tde_mimedir}/application/x-konsole.desktop +%{_tde_mimedir}/application/x-ktheme.desktop +%{_tde_mimedir}/application/x-smb-server.desktop +%{_tde_mimedir}/print +%{_tde_servicesdir}/textthumbnail.desktop +%{_tde_servicesdir}/htmlthumbnail.desktop +%{_tde_servicesdir}/ka*.desktop +%{_tde_servicesdir}/kdeprint_part.desktop +%{_tde_servicesdir}/konsolepart.desktop +%{_tde_servicesdir}/konsole-script.desktop +%{_tde_servicesdir}/kshorturifilter.desktop +%{_tde_servicesdir}/ku*.desktop +%{_tde_servicesdir}/searchproviders +%{_tde_servicesdir}/useragentstrings +%{_tde_servicesdir}/imagethumbnail.desktop +%{_tde_servicesdir}/kxkb.desktop +%{_tde_servicesdir}/kmanpart.desktop +%{_tde_servicesdir}/localdomainurifilter.desktop +%{_tde_servicesdir}/kwrited.desktop +%{_tde_servicesdir}/djvuthumbnail.desktop +%{_tde_servicesdir}/kded/kwrited.desktop +%{_tde_servicetypesdir}/terminalemulator.desktop +%{_tde_servicetypesdir}/kateplugin.desktop +%{_tde_servicetypesdir}/findpart.desktop +%{_tde_servicetypesdir}/searchprovider.desktop +%{_tde_servicetypesdir}/thumbcreator.desktop +%{_tde_servicetypesdir}/uasprovider.desktop +%exclude %{_tde_sounddir}/KDE_Close_Window* +%exclude %{_tde_sounddir}/KDE_Dialog* +%exclude %{_tde_sounddir}/KDE_Desktop* +%exclude %{_tde_sounddir}/KDE_Logout* +%exclude %{_tde_sounddir}/KDE_Startup* +%exclude %{_tde_sounddir}/KDE_Window* +%{_tde_sounddir} +%{_tde_sharedir}/templates +%{_tde_servicesdir}/khelpcenter.desktop +%{_tde_bindir}/keditbookmarks +%{_tde_bindir}/kfm* +%{_tde_datadir}/kbookmark +%{_tde_datadir}/keditbookmarks +%{_tde_iconsdir}/*/*/*/keditbookmarks.* +%{_tde_iconsdir}/*/*/*/kfm.* +%{_tde_iconsdir}/*/*/*/konqueror.* +%{_tde_servicesdir}/konq* +%{_tde_servicetypesdir}/konq* +%{_tde_servicesdir}/cursorthumbnail.desktop +%{_tde_modulesdir}/kcm_randr.* +%{_tde_bindir}/krandrtray +%{_tde_applicationsdir}/kde/krandrtray.desktop +%{_tde_modulesdir}/kded_mediamanager.* +%{_tde_modulesdir}/kfile_media.* +%{_tde_modulesdir}/kfile_trash.* +%{_tde_applicationsdir}/kde/devices.desktop +%{_tde_applicationsdir}/kde/knetattach.desktop +%{_tde_applicationsdir}/kde/opengl.desktop +%{_tde_iconsdir}/*/*/*/kcmopengl.* +%{_tde_mimedir}/media +%{_tde_servicesdir}/kded/mediamanager.desktop +%{_tde_servicesdir}/kded/homedirnotify.desktop +%{_tde_servicesdir}/kded/medianotifier.desktop +%{_tde_servicesdir}/kfile_media.desktop +%{_tde_servicesdir}/kfile_trash.desktop +%{_tde_servicesdir}/kfile_trash_system.desktop +%{_tde_mimedir}/fonts/package.desktop +%{_tde_modulesdir}/exrthumbnail.* +%{_tde_servicesdir}/exrthumbnail.desktop +%dir %{_tde_mimedir}/fonts +%{_tde_bindir}/kfontinst +%{_tde_modulesdir}/fontthumbnail.* +%{_tde_modulesdir}/kfile_font.* +%{_tde_modulesdir}/libkfontviewpart.* +%dir %{_tde_datadir}/kfontview +%{_tde_datadir}/kfontview/kfontviewpart.rc +%{_tde_applicationsdir}/kde/kcmfontinst.desktop +%{_tde_mimedir}/fonts/folder.desktop +%{_tde_mimedir}/fonts/system-folder.desktop +%{_tde_servicesdir}/fontthumbnail.desktop +%{_tde_servicesdir}/kfile_font.desktop +%{_tde_servicesdir}/kfontviewpart.desktop +%_mandir/man1/* +%{_mandir}/man8/kcheckpass.8.gz +%doc %lang(en) %{_tde_htmldir}/en/kcontrol +%doc %lang(en) %{_tde_htmldir}/en/kdcop +%doc %lang(en) %{_tde_htmldir}/en/kdebugdialog +%doc %lang(en) %{_tde_htmldir}/en/kdeprint +%doc %lang(en) %{_tde_htmldir}/en/kdesu +%exclude %{_tde_htmldir}/en/khelpcenter/userguide +%exclude %{_tde_htmldir}/en/khelpcenter/visualdict +%doc %lang(en) %{_tde_htmldir}/en/khelpcenter +%doc %lang(en) %{_tde_htmldir}/en/knetattach +%{_tde_applicationsdir}/kde/desktoppath.desktop + +%files samba +%defattr(-,root,root) +%{_tde_modulesdir}/kcm_samba.* +%{_tde_modulesdir}/kio_smb.* +%{_tde_servicesdir}/smb.protocol +%dir %{_tde_datadir}/konqueror/dirtree +%dir %{_tde_datadir}/konqueror/dirtree/remote +%{_tde_datadir}/konqueror/dirtree/remote/smb-network.desktop +%{_tde_mimedir}/application/x-smb-workgroup.desktop + +%files kdm +%defattr(-,root,root) +%dir %{_tde_docdir}/kdm +%{_tde_bindir}/genkdmconf +%{_tde_bindir}/kdm* +%{_tde_bindir}/krootimage +%{_tde_datadir}/kdm +%{_tde_modulesdir}/kgreet_pam.* +%doc %{_tde_docdir}/kdm/README +%dir %{_tde_configdir}/kdm +%config(noreplace) %{_tde_configdir}/kdm/kdmrc +%config(noreplace) %{_tde_configdir}/kdm/backgroundrc +%ghost /var/run/xdmctl +# kdm has not been renamed. +%{_sbindir}/rckdm +%{_tde_applicationsdir}/kde/kdm.desktop +%{_tde_iconsdir}/*/*/*/kdmconfig.* +%{_tde_modulesdir}/kcm_kdm.* +%doc %lang(en) %{_tde_htmldir}/en/kdm + +%files session +%defattr(-,root,root) +/usr/bin/tde +/usr/bin/starttde +/usr/share/xsessions/kde.desktop + +%files extra +%defattr(-,root,root) +%{_tde_bindir}/kpersonalizer +%{_tde_applicationsdir}/kde/kpersonalizer.desktop +%{_tde_datadir}/kpersonalizer +%{_tde_iconsdir}/*/*/*/kpersonalizer.* +%{_tde_bindir}/kfontview +%{_tde_applicationsdir}/kde/kfontview.desktop +%{_tde_datadir}/kfontview/kfontviewui.rc +%{_tde_modulesdir}/khotkeys_arts.* + +%files nsplugin +%defattr(-,root,root) +%{_tde_bindir}/nsplugin* +%{_tde_datadir}/plugin/nspluginpart.rc +%dir %{_tde_appsdir}/Settings/WebBrowsing +%{_tde_appsdir}/Settings/WebBrowsing/nsplugin.desktop + +%files devel +%defattr(-,root,root) +%{_tde_includedir}/* +%{_tde_libdir}/libkonq.so +%{_tde_libdir}/libkdecorations.so +%{_tde_libdir}/libkonqsidebarplugin.so +%{_tde_libdir}/libkickermain.so +%{_tde_libdir}/libtask*.so +%{_tde_libdir}/libksgrd.so +%{_tde_libdir}/libkickoffsearch_interfaces.so +%{_tde_libdir}/libkickoffsearch_interfaces.la +%{_tde_libdir}/libksplashthemes.so +%{_tde_libdir}/libkateinterfaces.so +%{_tde_libdir}/libkateutils.so +%{_tde_libdir}/libkhotkeys_shared.so +%{_tde_libdir}/libkateinterfaces.la +%{_tde_libdir}/libkateutils.la +%{_tde_libdir}/libkdecorations.la +%{_tde_libdir}/libkfontinst.la +%{_tde_libdir}/libkfontinst.so +%{_tde_libdir}/libkhotkeys_shared.la +%{_tde_libdir}/libkickermain.la +%{_tde_libdir}/libkonq.la +%{_tde_libdir}/libkonqsidebarplugin.la +%{_tde_libdir}/libksgrd.la +%{_tde_libdir}/libksplashthemes.la +%{_tde_libdir}/libtaskbar.la +%{_tde_libdir}/libtaskmanager.la +%{_tde_libdir}/libkasbar.so +%{_tde_libdir}/libkasbar.la + +%files ksysguardd +%defattr(-,root,root) +%dir /etc/slp.reg.d +%{_bindir}/ksysguardd +%{_tde_bindir}/ksysguardd +%config(noreplace) /etc/ksysguarddrc +/etc/init.d/ksysguardd +%{_sbindir}/rcksysguardd +%config(noreplace) /etc/slp.reg.d/* + +%files -n fileshareset +%defattr(-,root,root) +%config(noreplace) /etc/security/fileshare.conf +%{_bindir}/filesharelist +%verify(not mode) %{_bindir}/fileshareset +%{_mandir}/man8/fileshareset.8.gz + +%files apps +%defattr(-,root,root) +%{_tde_bindir}/konsole* +%{_tde_modulesdir}/konsole.* +%{_tde_modulesdir}/kcm_konsole.* +%{_tde_libdir}/libkdeinit_konsole.so +%{_tde_applicationsdir}/kde/konsole.desktop +%{_tde_applicationsdir}/kde/konsolesu.desktop +%doc %lang(en) %{_tde_htmldir}/en/konsole +%{_tde_applicationsdir}/kde/Home.desktop +%{_tde_libdir}/libkdeinit_konqueror.so +%{_tde_datadir}/konqueror/konq-simplebrowser.rc +%{_tde_applicationsdir}/kde/konquerorsu.desktop +%{_tde_appsdir}/konqueror.desktop +%doc %lang(en) %{_tde_htmldir}/en/konqueror +%{_tde_configdir}.kcfg/konqueror.kcfg +%{_tde_bindir}/konqueror +%{_tde_modulesdir}/konq*.so +%{_tde_modulesdir}/konq*.la +%dir %{_tde_datadir}/konqueror +%{_tde_datadir}/konqueror/tiles +%{_tde_datadir}/konqueror/about +%{_tde_datadir}/konqueror/icons +%{_tde_datadir}/konqueror/konqueror.rc +%{_tde_datadir}/konqueror/p* +%{_tde_datadir}/konqueror/servicemenus +%{_tde_modulesdir}/konqueror.* +%{_tde_datadir}/konqiconview +%{_tde_datadir}/konqlistview +%{_tde_datadir}/konqsidebartng +%{_tde_modulesdir}/kded_konqy_preloader.* +%{_tde_servicesdir}/kded/konqy_preloader.desktop +%{_tde_applicationsdir}/kde/konqbrowser.desktop +%{_tde_applicationsdir}/kde/konqfilemgr.desktop +%{_tde_configdir}.kcfg/konq_listview.kcfg +%config(noreplace) %{_tde_configdir}/konqsidebartng.rc +%{_tde_bindir}/kfind +%{_tde_modulesdir}/libkfindpart.* +%{_tde_applicationsdir}/kde/Kfind.desktop +%{_tde_datadir}/kfindpart +%{_tde_iconsdir}/*/*/*/kfind.* +%{_tde_servicesdir}/kfindpart.desktop +%doc %lang(en) %{_tde_htmldir}/en/kfind +%{_tde_bindir}/kwrite +%{_tde_modulesdir}/kwrite.* +%{_tde_libdir}/libkdeinit_kwrite.so +%{_tde_applicationsdir}/kde/kwrite.desktop +%{_tde_datadir}/kwrite +%{_tde_iconsdir}/*/*/*/kwrite.* +%doc %lang(en) %{_tde_htmldir}/en/kwrite +%{_tde_bindir}/kate +%{_tde_modulesdir}/kate.* +%{_tde_libdir}/libkateinterfaces.so.* +%{_tde_libdir}/libkateutils.so.* +%{_tde_libdir}/libkdeinit_kate.so +%{_tde_applicationsdir}/kde/kate.desktop +%{_tde_datadir}/kate +%{_tde_configdir}/katerc +%{_tde_iconsdir}/*/*/*/kate.* +%doc %lang(en) %{_tde_htmldir}/en/kate + +%files workspace +%defattr(-,root,root) +%exclude %{_datadir}/default_blue.* +%doc %lang(en) %{_tde_htmldir}/en/kicker +%{_datadir}/wallpapers +%{_tde_bindir}/startkde +%{_tde_bindir}/kdesktop +%{_tde_bindir}/kdesktop_lock +%{_tde_bindir}/ksmserver +%{_tde_libdir}/libkdeinit_ksmserver.so +%{_tde_bindir}/ksplash +%{_tde_bindir}/ksplashsimple +%{_tde_modulesdir}/kdesktop.* +%{_tde_datadir}/kdesktop +%{_tde_configdir}.kcfg/kdesktop.kcfg +%config(noreplace) %{_tde_configdir}/kdesktop_custom_menu* +%{_tde_bindir}/kicker +%{_tde_modulesdir}/kicker* +%{_tde_modulesdir}/kcm_kicker* +%{_tde_libdir}/libkickermain.so.* +%{_tde_applicationsdir}/kde/kcmkicker.desktop +%{_tde_datadir}/kicker +%{_tde_configdir}.kcfg/kickerSettings.kcfg +%{_tde_iconsdir}/*/*/*/kcmkicker.* +%{_tde_iconsdir}/*/*/*/kicker.* +%{_tde_libdir}/kconf_update_bin/kicker-3.4-reverseLayout +%{_tde_bindir}/kwin +%{_tde_bindir}/kwin_killer_helper +%{_tde_bindir}/kwin_rules_dialog +%{_tde_modulesdir}/kwin_* +%{_tde_datadir}/kwin +%{_tde_modulesdir}/kwin.* +%{_tde_modulesdir}/kwin3_* +%{_tde_libdir}/kconf_update_bin/kwin_update_default_rules +%{_tde_libdir}/kconf_update_bin/kwin_update_window_settings +%{_tde_applicationsdir}/kde/kwinrules.desktop +%{_tde_applicationsdir}/kde/kwindecoration.desktop +%{_tde_applicationsdir}/kde/kwinoptions.desktop +%{_tde_configdir}.kcfg/kwin.kcfg +%{_tde_iconsdir}/*/*/*/kwin.* +/var/adm/fillup-templates/sysconfig.windowmanager-kdebase3 +%{_tde_datadir}/ksplash +%{_tde_servicesdir}/ksplash.desktop +%{_tde_servicesdir}/ksplashdefault.desktop +%{_tde_servicesdir}/ksplashredmond.desktop +%{_tde_servicesdir}/ksplashstandard.desktop +%{_tde_servicetypesdir}/ksplashplugins.desktop +%{_tde_iconsdir}/*/*/*/ksplash.* +%{_tde_modulesdir}/ksplash* +%{_tde_libdir}/libksplashthemes.so.* +%{_tde_iconsdir}/*/*/apps/kcmsmserver.* +%{_tde_applicationsdir}/kde/kcmsmserver.desktop +%{_tde_modulesdir}/ksmserver.* +%{_tde_datadir}/ksmserver +%{_tde_modulesdir}/clock_panelapplet.* +%{_tde_modulesdir}/dockbar_panelextension.* +%{_tde_modulesdir}/kasbar_panelextension.* +%{_tde_modulesdir}/menu_panelapplet.* +%{_tde_modulesdir}/klipper_panelapplet.* +%{_tde_modulesdir}/launcher_panelapplet.* +%{_tde_modulesdir}/lockout_panelapplet.* +%{_tde_modulesdir}/minipager_panelapplet.* +%{_tde_modulesdir}/naughty_panelapplet.* +%{_tde_modulesdir}/run_panelapplet.* +%{_tde_modulesdir}/sidebar_panelextension.* +%{_tde_applicationsdir}/kde/panel.desktop +%{_tde_applicationsdir}/kde/panel_appearance.desktop +%{_tde_modulesdir}/media_panelapplet.* +%{_tde_modulesdir}/kcm_taskbar.* +%{_tde_applicationsdir}/kde/kcmtaskbar.desktop +%{_tde_configdir}.kcfg/taskbar.kcfg +%{_tde_iconsdir}/*/*/apps/kcmtaskbar.* +%{_tde_modulesdir}/kcm_screensaver.* +%{_tde_applicationsdir}/kde/screensaver.desktop +%{_tde_appsdir}/System/ScreenSavers/KBlankscreen.desktop +%{_tde_appsdir}/System/ScreenSavers/KRandom.desktop +%{_tde_bindir}/kwebdesktop +%{_tde_configdir}.kcfg/kwebdesktop.kcfg +%{_tde_applicationsdir}/kde/background.desktop +%{_tde_modulesdir}/kcm_background* +%{_tde_bindir}/default_desktop_aligning +%{_tde_applicationsdir}/kde/desktop.desktop +%{_tde_applicationsdir}/kde/desktopbehavior.desktop +%{_tde_applicationsdir}/kde/ksplashthememgr.desktop +%{_tde_iconsdir}/*/*/apps/kcmdesktop.* +%{_tde_iconsdir}/*/*/apps/kcmdesktopbehavior.* +%{_tde_modulesdir}/kcm_ksplashthemes.* +%{_tde_modulesdir}/kcm_kwindecoration.* +%{_tde_modulesdir}/kcm_kwinoptions.* +%{_tde_modulesdir}/kcm_kwinrules.* +%doc %lang(en) %{_tde_htmldir}/en/ksplashml +%{_tde_prefix}/shutdown +%{_tde_libdir}/libkickoffsearch_interfaces.so.* +%{_tde_servicetypesdir}/kickoffsearchplugin.desktop +%{_tde_sharedir}/autostart/* +%{_tde_datadir}/naughtyapplet +%{_tde_libdir}/libtask*.so.* +%{_tde_bindir}/extensionproxy +%{_tde_bindir}/appletproxy +%{_tde_modulesdir}/appletproxy.* +%{_tde_modulesdir}/extensionproxy.* +%{_tde_modulesdir}/taskbar* +%{_tde_modulesdir}/trash_panelapplet* +%{_tde_modulesdir}/sys* +%{_tde_datadir}/clockapplet +%{_tde_bindir}/kasbar +%{_tde_libdir}/libkasbar.so.* +%{_tde_libdir}/libkdeinit_kicker.so +%{_tde_libdir}/libkdeinit_appletproxy.so +%{_tde_libdir}/libkdeinit_extensionproxy.so +%{_tde_libdir}/libkdeinit_kdesktop.so +%{_tde_libdir}/libkdeinit_kwin.so +%{_tde_libdir}/libkdeinit_kwin_rules_dialog.so +%{_tde_bindir}/ktip +%{_tde_sharedir}/appl*/*/ktip.desktop +%{_tde_iconsdir}/*/*/*/ktip.* +%{_tde_bindir}/kpager +%{_tde_sharedir}/appl*/*/kpager.desktop +%{_tde_iconsdir}/*/*/*/kpager.* +%doc %lang(en) %{_tde_htmldir}/en/kpager +%{_tde_bindir}/klipper +%{_tde_modulesdir}/klipper.* +%{_tde_libdir}/libkdeinit_klipper.so +%{_tde_applicationsdir}/kde/klipper.desktop +%config(noreplace) %{_tde_configdir}/klipperrc +%{_tde_iconsdir}/*/*/*/klipper.* +%doc %lang(en) %{_tde_htmldir}/en/klipper +%{_tde_applicationsdir}/kde/kmenuedit.desktop +%{_tde_datadir}/kmenuedit +%{_tde_iconsdir}/*/*/*/kmenuedit.* +%doc %lang(en) %{_tde_htmldir}/en/kmenuedit +%{_tde_bindir}/kmenuedit +%{_tde_modulesdir}/kmenuedit.* +%{_tde_libdir}/libkdeinit_kmenuedit.so +%{_tde_bindir}/kinfocenter +%{_tde_applicationsdir}/kde/kinfocenter.desktop +%{_tde_datadir}/kinfocenter +%doc %lang(en) %{_tde_htmldir}/en/kinfocenter +%doc %lang(en) %{_tde_htmldir}/en/khelpcenter/userguide +%doc %lang(en) %{_tde_htmldir}/en/khelpcenter/visualdict +%{_tde_sounddir}/KDE_Close_Window* +%{_tde_sounddir}/KDE_Dialog* +%{_tde_sounddir}/KDE_Desktop* +%{_tde_sounddir}/KDE_Logout* +%{_tde_sounddir}/KDE_Startup* +%{_tde_sounddir}/KDE_Window* +%{_tde_libdir}/libkdeinit_khotkeys.so +%{_tde_modulesdir}/kcm_khotkeys.* +%{_tde_modulesdir}/kcm_khotkeys_init.* +%{_tde_iconsdir}/*/*/*/khotkeys.* +%{_tde_bindir}/khotkeys +%{_tde_libdir}/kconf_update_bin/khotkeys_update +%{_tde_modulesdir}/khotkeys.* +%{_tde_modulesdir}/kded_khotkeys.* +%{_tde_libdir}/libkhotkeys_shared.so.* +%{_tde_applicationsdir}/kde/khotkeys.desktop +%{_tde_datadir}/khotkeys +%{_tde_servicesdir}/kded/khotkeys.desktop +%{_tde_bindir}/ksysguard +%{_tde_applicationsdir}/kde/ksysguard.desktop +%{_tde_datadir}/ksysguard +%{_tde_iconsdir}/*/*/*/ksysguard.* +%{_tde_mimedir}/application/x-ksysguard.desktop +%doc %lang(en) %{_tde_htmldir}/en/ksysguard +%doc %lang(en) %{_tde_htmldir}/en/kxkb +%{_tde_libdir}/libksgrd.so.* +%{_tde_bindir}/kompmgr +%doc %lang(en) %{_tde_htmldir}/en/kompmgr + +%files runtime +%defattr(-,root,root) +%doc %lang(en) %{_tde_htmldir}/en/kioslave +%exclude %{_tde_modulesdir}/kio_smb.* +%exclude %{_tde_servicesdir}/smb.protocol +%{_tde_bindir}/kde3 +%{_tde_bindir}/kreadconfig +%{_tde_bindir}/kwriteconfig +%{_tde_bindir}/kprinter +%{_tde_libdir}/libkdeinit_kprinter.so +%{_tde_bindir}/kdesu +%{_tde_modulesdir}/kio_* +%{_tde_libdir}/libkfontinst.so.* +%{_tde_servicesdir}/*.protocol +%{_tde_libdir}/libkonq.so.* +%{_tde_libdir}/libkonqsidebarplugin.so.* +%{_tde_modulesdir}/kded_favicons.* +%{_tde_servicesdir}/kded/favicons.desktop +%{_tde_libdir}/libkdecorations.so.* +%{_tde_modulesdir}/kgreet_winbind.* +%{_tde_modulesdir}/kgreet_classic.* +%config /etc/pam.d/kcheckpass +%verify(not mode) %attr(4755,root,shadow) %{_tde_bindir}/kcheckpass +%{_tde_iconsdir}/*/*/*/knotify.* +%{_tde_iconsdir}/*/*/*/kscreensaver.* +%{_tde_iconsdir}/*/*/*/style.* +%{_tde_iconsdir}/*/*/*/looknfeel.* +%{_tde_iconsdir}/*/*/*/iconthemes.* +%{_tde_iconsdir}/*/*/*/keyboard.* +%{_tde_iconsdir}/*/*/*/kcmsound.* +%{_tde_iconsdir}/*/*/*/energy.* +%{_tde_iconsdir}/*/*/*/kcmkwm.* +%{_tde_iconsdir}/*/*/*/hwinfo.* +%{_tde_iconsdir}/*/*/*/date.* +%{_tde_iconsdir}/*/*/*/filetypes.* +%{_tde_iconsdir}/*/*/*/kcmsystem.* +%{_tde_iconsdir}/*/*/*/personal.* + +%changelog diff --git a/opensuse/core/tdebase/teach-minicli-lock.diff b/opensuse/core/tdebase/teach-minicli-lock.diff new file mode 100644 index 000000000..73bd7da1e --- /dev/null +++ b/opensuse/core/tdebase/teach-minicli-lock.diff @@ -0,0 +1,30 @@ +Index: kdesktop/minicli.cpp +=================================================================== +--- kdesktop/minicli.cpp.orig ++++ kdesktop/minicli.cpp +@@ -265,7 +265,9 @@ void Minicli::accept() + } + + bool logout = (cmd == "logout"); +- if( !logout && runCommand() == 1 ) ++ bool lock = (cmd == "lock"); ++ ++ if( !logout && !lock && runCommand() == 1 ) + return; + + m_dlg->cbCommand->addToHistory( m_dlg->cbCommand->currentText().stripWhiteSpace() ); +@@ -278,6 +280,14 @@ void Minicli::accept() + kapp->propagateSessionManager(); + kapp->requestShutDown(); + } ++ if ( lock ) ++ { ++ QCString appname( "kdesktop" ); ++ int kicker_screen_number = qt_xscreen(); ++ if ( kicker_screen_number ) ++ appname.sprintf("kdesktop-screen-%d", kicker_screen_number); ++ kapp->dcopClient()->send(appname, "KScreensaverIface", "lock()", ""); ++ } + } + + void Minicli::reject() diff --git a/opensuse/core/tdebase/uninit.diff b/opensuse/core/tdebase/uninit.diff new file mode 100644 index 000000000..92dd544ab --- /dev/null +++ b/opensuse/core/tdebase/uninit.diff @@ -0,0 +1,10 @@ +--- kcontrol/randr/randroutput.cpp ++++ kcontrol/randr/randroutput.cpp +@@ -383,6 +383,7 @@ RandRCrtc *RandROutput::findEmptyCrtc() + if (crtc->connectedOutputs().count() == 0) + return crtc; + } ++ return crtc; + } + + bool RandROutput::tryCrtc(RandRCrtc *crtc, int changes) diff --git a/opensuse/core/tdebase/use-full-hinting-by-default.diff b/opensuse/core/tdebase/use-full-hinting-by-default.diff new file mode 100644 index 000000000..3375f0943 --- /dev/null +++ b/opensuse/core/tdebase/use-full-hinting-by-default.diff @@ -0,0 +1,35 @@ +Index: kcontrol/fonts/fonts.cpp +=================================================================== +--- kcontrol/fonts/fonts.cpp.orig ++++ kcontrol/fonts/fonts.cpp +@@ -332,7 +332,7 @@ bool FontAASettings::load( bool useDefau + kglobals.setReadDefaults( useDefaults ); + + kglobals.setGroup("General"); +- hStyle=KXftConfig::Hint::Medium; ++ hStyle=KXftConfig::Hint::Full; + xft.setHintStyle(hStyle); + xft.apply(); // Save this setting + kglobals.writeEntry("XftHintStyle", KXftConfig::toStr(hStyle)); +@@ -450,7 +450,7 @@ KXftConfig::Hint::Style FontAASettings:: + if(hintingStyle->currentText()==KXftConfig::description((KXftConfig::Hint::Style)s)) + return (KXftConfig::Hint::Style)s; + +- return KXftConfig::Hint::Medium; ++ return KXftConfig::Hint::Full; + } + #endif + +Index: kcontrol/krdb/krdb.cpp +=================================================================== +--- kcontrol/krdb/krdb.cpp.orig ++++ kcontrol/krdb/krdb.cpp +@@ -524,7 +524,7 @@ void runRdb( uint flags ) + + if (kglobals.hasKey("XftHintStyle")) + { +- QString hintStyle = kglobals.readEntry("XftHintStyle", "hintmedium"); ++ QString hintStyle = kglobals.readEntry("XftHintStyle", "hintfull"); + contents += "Xft.hinting: "; + if(hintStyle.isEmpty()) + contents += "-1\n"; diff --git a/opensuse/core/tdebase/use-pam-before-classic.diff b/opensuse/core/tdebase/use-pam-before-classic.diff new file mode 100644 index 000000000..4f2a00008 --- /dev/null +++ b/opensuse/core/tdebase/use-pam-before-classic.diff @@ -0,0 +1,17 @@ +Index: kdesktop/lock/lockprocess.cc +=================================================================== +--- kdesktop/lock/lockprocess.cc.orig ++++ kdesktop/lock/lockprocess.cc +@@ -364,8 +364,10 @@ void LockProcess::configure() + readSaver(); + + mPlugins = KDesktopSettings::pluginsUnlock(); +- if (mPlugins.isEmpty()) +- mPlugins = QStringList("classic"); ++ if (mMethod == "pam") ++ mPlugins << mMethod; ++ if (mMethod == "pam" || mPlugins.isEmpty()) ++ mPlugins << "classic"; + mPluginOptions = KDesktopSettings::pluginOptions(); + } + diff --git a/opensuse/core/tdebase/wizard_small.png b/opensuse/core/tdebase/wizard_small.png Binary files differnew file mode 100644 index 000000000..52233e341 --- /dev/null +++ b/opensuse/core/tdebase/wizard_small.png diff --git a/opensuse/core/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff b/opensuse/core/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff new file mode 100644 index 000000000..b5681e0a3 --- /dev/null +++ b/opensuse/core/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff @@ -0,0 +1,44 @@ +Index: nsplugins/nspluginloader.cpp +=================================================================== +--- nsplugins/nspluginloader.cpp.orig ++++ nsplugins/nspluginloader.cpp +@@ -322,7 +322,7 @@ QString NSPluginLoader::lookup(const QSt + } + + +-bool NSPluginLoader::loadViewer() ++bool NSPluginLoader::loadViewer(const QString &mimeType) + { + kdDebug() << "NSPluginLoader::loadViewer" << endl; + +@@ -346,7 +346,7 @@ bool NSPluginLoader::loadViewer() + } + + // find the external artsdsp process +- if( _useArtsdsp ) { ++ if( _useArtsdsp && mimeType != "application/pdf" ) { + kdDebug() << "trying to use artsdsp" << endl; + QString artsdsp = KGlobal::dirs()->findExe("artsdsp"); + if (!artsdsp) +@@ -460,7 +460,7 @@ NSPluginInstance *NSPluginLoader::newIns + if ( !_viewer ) + { + // load plugin viewer process +- loadViewer(); ++ loadViewer(mimeType); + + if ( !_viewer ) + { +Index: nsplugins/nspluginloader.h +=================================================================== +--- nsplugins/nspluginloader.h.orig ++++ nsplugins/nspluginloader.h +@@ -100,7 +100,7 @@ protected: + QString lookup(const QString &mimeType); + QString lookupMimeType(const QString &url); + +- bool loadViewer(); ++ bool loadViewer(const QString &mimeType); + void unloadViewer(); + + protected slots: diff --git a/opensuse/core/tdebase/xcursor.diff b/opensuse/core/tdebase/xcursor.diff new file mode 100644 index 000000000..8c4010915 --- /dev/null +++ b/opensuse/core/tdebase/xcursor.diff @@ -0,0 +1,36 @@ +Index: kcontrol/input/xcursor/themepage.cpp +=================================================================== +--- kcontrol/input/xcursor/themepage.cpp.orig ++++ kcontrol/input/xcursor/themepage.cpp +@@ -73,6 +73,13 @@ struct ThemeInfo { + }; + + ++static QString defaultThemeDescription( const QString& theme ) ++{ ++ if( theme == "redglass" || theme == "whiteglass" || theme == "pseudocore" || theme == "handhelds" ) ++ return i18n( "XFree theme %1 - incomplete for KDE" ).arg( theme ); ++ return i18n( "No description available" );; ++} ++ + ThemePage::ThemePage( QWidget* parent, const char* name ) + : QWidget( parent, name ), selectedTheme( NULL ), currentTheme( NULL ) + { +@@ -333,7 +340,7 @@ void ThemePage::insertTheme( const QStri + + // Defaults in case there's no name or comment field. + QString name = dirName; +- QString desc = i18n( "No description available" ); ++ QString desc = defaultThemeDescription( name ); + QString sample = "left_ptr"; + + KSimpleConfig c( path + "/index.theme", true ); // Open read-only +@@ -480,7 +487,7 @@ void ThemePage::insertThemes() + // Defaults in case there's no index.theme file or it lacks + // a name and a comment field. + QString name = *it; +- QString desc = i18n( "No description available" ); ++ QString desc = defaultThemeDescription( name ); + QString sample = "left_ptr"; + + // Parse the index.theme file if the theme has one. diff --git a/opensuse/core/tdebase/xinerama.patch b/opensuse/core/tdebase/xinerama.patch new file mode 100644 index 000000000..41aedbcba --- /dev/null +++ b/opensuse/core/tdebase/xinerama.patch @@ -0,0 +1,951 @@ +Index: kdesktop/minicli.cpp +=================================================================== +--- kdesktop/minicli.cpp.orig ++++ kdesktop/minicli.cpp +@@ -379,6 +379,17 @@ int Minicli::runCommand() + cmd = uri.path(); + else + cmd = uri.url(); ++ ++ QCString asn; ++ if( qApp->desktop()->isVirtualDesktop()) ++ { ++ asn = KStartupInfo::createNewStartupId(); ++ KStartupInfoId id; ++ id.initId( asn ); ++ KStartupInfoData data; ++ data.setXinerama( qApp->desktop()->screenNumber( this )); ++ KStartupInfo::sendChange( id, data ); ++ } + + // Determine whether the application should be run through + // the command line (terminal) interface... +@@ -514,7 +525,7 @@ int Minicli::runCommand() + case KURIFilterData::HELP: + { + // No need for kfmclient, KRun does it all (David) +- (void) new KRun( m_filterData->uri(), parentWidget()); ++ (void) new KRun( m_filterData->uri(), parentWidget(), asn ); + return 0; + } + case KURIFilterData::EXECUTABLE: +@@ -526,7 +537,7 @@ int Minicli::runCommand() + if (service && service->isValid() && service->type() == "Application") + { + notifyServiceStarted(service); +- KRun::run(*service, KURL::List()); ++ KRun::run(*service, KURL::List(), parentWidget(), asn ); + return 0; + } + } +@@ -561,7 +572,7 @@ int Minicli::runCommand() + if (service && service->isValid() && service->type() == "Application") + { + notifyServiceStarted(service); +- KRun::run(*service, KURL::List(), this); ++ KRun::run(*service, KURL::List(), parentWidget(), asn ); + return 0; + } + +@@ -569,7 +580,7 @@ int Minicli::runCommand() + if (service && service->isValid() && service->type() == "Application") + { + notifyServiceStarted(service); +- KRun::run(*service, KURL::List(), this); ++ KRun::run(*service, KURL::List(), parentWidget(), asn ); + return 0; + } + +@@ -581,7 +592,7 @@ int Minicli::runCommand() + } + } + +- if ( KRun::runCommand( cmd, exec, m_iconName ) ) ++ if ( KRun::runCommand( cmd, exec, m_iconName, parentWidget(), asn ) ) + return 0; + else + { +Index: kdesktop/desktop.cc +=================================================================== +--- kdesktop/desktop.cc.orig ++++ kdesktop/desktop.cc +@@ -520,9 +520,12 @@ void KDesktop::popupExecuteCommand(const + if ( m_miniCli->isVisible() ) { + KWin::forceActiveWindow( m_miniCli->winId() ); + } else { +- QRect rect = KGlobalSettings::desktopGeometry(QCursor::pos()); +- m_miniCli->move(rect.x() + (rect.width() - m_miniCli->width())/2, +- rect.y() + (rect.height() - m_miniCli->height())/2); ++ NETRootInfo i( qt_xdisplay(), NET::Supported ); ++ if( !i.isSupported( NET::WM2FullPlacement )) { ++ QRect rect = KGlobalSettings::desktopGeometry(QCursor::pos()); ++ m_miniCli->move(rect.x() + (rect.width() - m_miniCli->width())/2, ++ rect.y() + (rect.height() - m_miniCli->height())/2); ++ } + m_miniCli->show(); // non-modal + } + } +Index: kwin/useractions.cpp +=================================================================== +--- kwin/useractions.cpp.orig ++++ kwin/useractions.cpp +@@ -482,27 +482,33 @@ bool Client::performMouseCommand( Option + case Options::MouseActivateAndRaise: + replay = isActive(); // for clickraise mode + workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled && replay ); ++ workspace()->setActiveScreenMouse( globalPos ); + break; + case Options::MouseActivateAndLower: + workspace()->requestFocus( this ); + workspace()->lowerClient( this ); ++ workspace()->setActiveScreenMouse( globalPos ); + break; + case Options::MouseActivate: + replay = isActive(); // for clickraise mode + workspace()->takeActivity( this, ActivityFocus, handled && replay ); ++ workspace()->setActiveScreenMouse( globalPos ); + break; + case Options::MouseActivateRaiseAndPassClick: + workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled ); ++ workspace()->setActiveScreenMouse( globalPos ); + replay = TRUE; + break; + case Options::MouseActivateAndPassClick: + workspace()->takeActivity( this, ActivityFocus, handled ); ++ workspace()->setActiveScreenMouse( globalPos ); + replay = TRUE; + break; + case Options::MouseActivateRaiseAndMove: + case Options::MouseActivateRaiseAndUnrestrictedMove: + workspace()->raiseClient( this ); + workspace()->requestFocus( this ); ++ workspace()->setActiveScreenMouse( globalPos ); + if( options->moveMode == Options::Transparent && isMovable()) + move_faked_activity = workspace()->fakeRequestedActivity( this ); + // fallthrough +@@ -709,6 +715,40 @@ void Workspace::slotWindowToDesktop( int + sendClientToDesktop( c, i, true ); + } + ++void Workspace::slotSwitchToScreen( int i ) ++ { ++ setCurrentScreen( i ); ++ } ++ ++void Workspace::slotSwitchToNextScreen() ++ { ++ slotSwitchToScreen(( activeScreen() + 1 ) % numScreens()); ++ } ++ ++void Workspace::slotWindowToScreen( int i ) ++ { ++ Client* c = active_popup_client ? active_popup_client : active_client; ++ if( i >= 0 && i <= numScreens() && c ++ && !c->isDesktop() ++ && !c->isDock() ++ && !c->isTopMenu()) ++ { ++ sendClientToScreen( c, i ); ++ } ++ } ++ ++void Workspace::slotWindowToNextScreen() ++ { ++ Client* c = active_popup_client ? active_popup_client : active_client; ++ if( c ++ && !c->isDesktop() ++ && !c->isDock() ++ && !c->isTopMenu()) ++ { ++ sendClientToScreen( c, ( c->screen() + 1 ) % numScreens()); ++ } ++ } ++ + /*! + Maximizes the popup client + */ +Index: kwin/options.h +=================================================================== +--- kwin/options.h.orig ++++ kwin/options.h +@@ -124,6 +124,11 @@ class Options : public KDecorationOption + */ + enum AltTabStyle { KDE, CDE }; + AltTabStyle altTabStyle; ++ ++ // whether to see Xinerama screens separately for focus (in Alt+Tab, when activating next client) ++ bool separateScreenFocus; ++ // whether active Xinerama screen is the one with mouse (or with the active window) ++ bool activeMouseScreen; + + /** + * Xinerama options +@@ -133,6 +138,9 @@ class Options : public KDecorationOption + bool xineramaMovementEnabled; + bool xineramaMaximizeEnabled; + bool xineramaFullscreenEnabled; ++ ++ // number, or -1 = active screen (Workspace::activeScreen()) ++ int xineramaPlacementScreen; + + /** + MoveResizeMode, either Tranparent or Opaque. +Index: kwin/workspace.h +=================================================================== +--- kwin/workspace.h.orig ++++ kwin/workspace.h +@@ -91,6 +91,7 @@ class Workspace : public QObject, public + + QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const; + QRect clientArea( clientAreaOption, const Client* c ) const; ++ QRect clientArea( clientAreaOption, int screen, int desktop ) const; + + /** + * @internal +@@ -161,6 +162,13 @@ class Workspace : public QObject, public + */ + int numberOfDesktops() const; + void setNumberOfDesktops( int n ); ++ ++ int activeScreen() const; ++ int numScreens() const; ++ void checkActiveScreen( const Client* c ); ++ void setActiveScreenMouse( QPoint mousepos ); ++ QRect screenGeometry( int screen ) const; ++ int screenNumber( QPoint pos ) const; + + QWidget* desktopWidget(); + +@@ -186,6 +194,7 @@ class Workspace : public QObject, public + void sendClientToDesktop( Client* c, int desktop, bool dont_activate ); + void windowToPreviousDesktop( Client* c ); + void windowToNextDesktop( Client* c ); ++ void sendClientToScreen( Client* c, int screen ); + + // KDE4 remove me - and it's also in the DCOP interface :( + void showWindowMenuAt( unsigned long id, int x, int y ); +@@ -224,6 +233,7 @@ class Workspace : public QObject, public + void nextDesktop(); + void previousDesktop(); + void circulateDesktopApplications(); ++ void setCurrentScreen( int new_screen ); + + QString desktopName( int desk ) const; + virtual void setDesktopLayout(int , int , int ); +@@ -301,6 +311,10 @@ class Workspace : public QObject, public + //void slotSwitchToWindow( int ); + void slotWindowToDesktop( int ); + //void slotWindowToListPosition( int ); ++ void slotSwitchToScreen( int ); ++ void slotWindowToScreen( int ); ++ void slotSwitchToNextScreen(); ++ void slotWindowToNextScreen(); + + void slotWindowMaximize(); + void slotWindowMaximizeVertical(); +@@ -481,6 +495,7 @@ class Workspace : public QObject, public + int current_desktop; + int number_of_desktops; + QMemArray<int> desktop_focus_chain; ++ int active_screen; + + QWidget* active_popup; + Client* active_popup_client; +Index: kwin/tabbox.cpp +=================================================================== +--- kwin/tabbox.cpp.orig ++++ kwin/tabbox.cpp +@@ -23,7 +23,6 @@ License. See the file "COPYING" for the + #include <klocale.h> + #include <qapplication.h> + #include <qdesktopwidget.h> +-#include <qcursor.h> + #include <kstringhandler.h> + #include <stdarg.h> + #include <kdebug.h> +@@ -110,26 +109,36 @@ void TabBox::createClientList(ClientList + + while ( c ) + { ++ Client* add = NULL; + if ( ((desktop == -1) || c->isOnDesktop(desktop)) + && c->wantsTabFocus() ) ++ { // don't add windows that have modal dialogs ++ Client* modal = c->findModal(); ++ if( modal == NULL || modal == c ) ++ add = c; ++ else if( !list.contains( modal )) ++ add = modal; ++ else ++ { ++ // nothing ++ } ++ } ++ ++ if( options->separateScreenFocus && options->xineramaEnabled ) + { +- if ( start == c ) ++ if( c->screen() != workspace()->activeScreen()) ++ add = NULL; ++ } ++ ++ if( add != NULL ) ++ { ++ if ( start == add ) + { +- list.remove( c ); +- list.prepend( c ); ++ list.remove( add ); ++ list.prepend( add ); + } + else +- { // don't add windows that have modal dialogs +- Client* modal = c->findModal(); +- if( modal == NULL || modal == c ) +- list += c; +- else if( !list.contains( modal )) +- list += modal; +- else +- { +- // nothing +- } +- } ++ list += add; + } + + if ( chain ) +@@ -156,7 +165,7 @@ void TabBox::reset() + { + int w, h, cw = 0, wmax = 0; + +- QRect r = KGlobalSettings::desktopGeometry(QCursor::pos()); ++ QRect r = workspace()->screenGeometry( workspace()->activeScreen()); + + // calculate height of 1 line + // fontheight + 1 pixel above + 1 pixel below, or 32x32 icon + 2 pixel above + below +Index: kwin/kcmkwin/kwinoptions/windows.h +=================================================================== +--- kwin/kcmkwin/kwinoptions/windows.h.orig ++++ kwin/kcmkwin/kwinoptions/windows.h +@@ -86,6 +86,7 @@ private slots: + void delayFocusOnTog(bool); + void clickRaiseOnTog(bool); + void updateAltTabMode(); ++ void updateActiveMouseScreen(); + void changed() { emit KCModule::changed(true); } + + +@@ -101,6 +102,8 @@ private: + void setDelayFocusInterval(int); + void setDelayFocus(bool); + void setClickRaise(bool); ++ void setSeparateScreenFocus(bool); ++ void setActiveMouseScreen(bool); + void setAltTabMode(bool); + void setTraverseAll(bool); + void setRollOverDesktops(bool); +@@ -113,6 +116,8 @@ private: + QCheckBox *clickRaiseOn; + KIntNumInput *autoRaise; + KIntNumInput *delayFocus; ++ QCheckBox *separateScreenFocus; ++ QCheckBox *activeMouseScreen; + + QButtonGroup *kbdBox; + QCheckBox *altTabPopup; +Index: kwin/kcmkwin/kwinoptions/windows.cpp +=================================================================== +--- kwin/kcmkwin/kwinoptions/windows.cpp.orig ++++ kwin/kcmkwin/kwinoptions/windows.cpp +@@ -76,6 +76,8 @@ + #define KWIN_SHADEHOVER_INTERVAL "ShadeHoverInterval" + #define KWIN_FOCUS_STEALING "FocusStealingPreventionLevel" + #define KWIN_HIDE_UTILITY "HideUtilityWindowsForInactive" ++#define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus" ++#define KWIN_ACTIVE_MOUSE_SCREEN "ActiveMouseScreen" + + // kwm config keywords + #define KWM_ELECTRIC_BORDER "ElectricBorders" +@@ -209,6 +211,27 @@ KFocusConfig::KFocusConfig (bool _standA + QWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over" + " will automatically receive focus.") ); + ++ separateScreenFocus = new QCheckBox( i18n( "S&eparate screen focus" ), fcsBox ); ++ fLay->addWidget( separateScreenFocus ); ++ wtstr = i18n( "When this option is enabled, focus operations are limited only to the active Xinerama screen" ); ++ QWhatsThis::add( separateScreenFocus, wtstr ); ++ ++ activeMouseScreen = new QCheckBox( i18n( "Active &mouse screen" ), fcsBox ); ++ fLay->addWidget( activeMouseScreen ); ++ wtstr = i18n( "When this option is enabled, active Xinerama screen (where for example new windows appear)" ++ " is the screen with the mouse pointer. When disabled, the active Xinerama screen is the screen" ++ " with the focused window. This option is by default disabled for Click to focus and" ++ " enabled for other focus policies." ); ++ QWhatsThis::add( activeMouseScreen, wtstr ); ++ connect(focusCombo, SIGNAL(activated(int)), this, SLOT(updateActiveMouseScreen())); ++ ++ if (!QApplication::desktop()->isVirtualDesktop() || ++ QApplication::desktop()->numScreens() == 1) // No Ximerama ++ { ++ separateScreenFocus->hide(); ++ activeMouseScreen->hide(); ++ } ++ + lay->addWidget(fcsBox); + + kbdBox = new QButtonGroup(i18n("Navigation"), this); +@@ -260,6 +283,8 @@ KFocusConfig::KFocusConfig (bool _standA + connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed())); + connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed())); + connect(delayFocus, SIGNAL(valueChanged(int)), SLOT(changed())); ++ connect(separateScreenFocus, SIGNAL(clicked()), SLOT(changed())); ++ connect(activeMouseScreen, SIGNAL(clicked()), SLOT(changed())); + connect(altTabPopup, SIGNAL(clicked()), SLOT(changed())); + connect(traverseAll, SIGNAL(clicked()), SLOT(changed())); + connect(rollOverDesktops, SIGNAL(clicked()), SLOT(changed())); +@@ -366,6 +391,22 @@ void KFocusConfig::delayFocusOnTog(bool + void KFocusConfig::clickRaiseOnTog(bool ) { + } + ++void KFocusConfig::setSeparateScreenFocus(bool s) { ++ separateScreenFocus->setChecked(s); ++} ++ ++void KFocusConfig::setActiveMouseScreen(bool a) { ++ activeMouseScreen->setChecked(a); ++} ++ ++void KFocusConfig::updateActiveMouseScreen() ++{ ++ // on by default for non click to focus policies ++ KConfigGroup cfg( config, "Windows" ); ++ if( !cfg.hasKey( KWIN_ACTIVE_MOUSE_SCREEN )) ++ setActiveMouseScreen( focusCombo->currentItem() != 0 ); ++} ++ + void KFocusConfig::setAltTabMode(bool a) { + altTabPopup->setChecked(a); + } +@@ -412,6 +453,10 @@ void KFocusConfig::load( void ) + setClickRaise(key != "off"); + setAutoRaiseEnabled(); // this will disable/hide the auto raise delay widget if focus==click + setDelayFocusEnabled(); ++ ++ setSeparateScreenFocus( config->readBoolEntry(KWIN_SEPARATE_SCREEN_FOCUS, false)); ++ // on by default for non click to focus policies ++ setActiveMouseScreen( config->readBoolEntry(KWIN_ACTIVE_MOUSE_SCREEN, focusCombo->currentItem() != 0 )); + + key = config->readEntry(KWIN_ALTTABMODE, "KDE"); + setAltTabMode(key == "KDE"); +@@ -467,6 +512,9 @@ void KFocusConfig::save( void ) + else + config->writeEntry(KWIN_CLICKRAISE, "off"); + ++ config->writeEntry(KWIN_SEPARATE_SCREEN_FOCUS, separateScreenFocus->isChecked()); ++ config->writeEntry(KWIN_ACTIVE_MOUSE_SCREEN, activeMouseScreen->isChecked()); ++ + if (altTabPopup->isChecked()) + config->writeEntry(KWIN_ALTTABMODE, "KDE"); + else +@@ -500,6 +548,9 @@ void KFocusConfig::defaults() + setAutoRaise(false); + setDelayFocus(false); + setClickRaise(true); ++ setSeparateScreenFocus( false ); ++ // on by default for non click to focus policies ++ setActiveMouseScreen( focusCombo->currentItem() != 0 ); + setAltTabMode(true); + setTraverseAll( false ); + setRollOverDesktops(true); +Index: kwin/popupinfo.h +=================================================================== +--- kwin/popupinfo.h.orig ++++ kwin/popupinfo.h +@@ -24,7 +24,7 @@ class PopupInfo : public QWidget + { + Q_OBJECT + public: +- PopupInfo( const char *name=0 ); ++ PopupInfo( Workspace* ws, const char *name=0 ); + ~PopupInfo(); + + void reset(); +@@ -43,6 +43,7 @@ class PopupInfo : public QWidget + bool m_show; + bool m_shown; + QString m_infoString; ++ Workspace* workspace; + }; + + } // namespace +Index: kwin/options.cpp +=================================================================== +--- kwin/options.cpp.orig ++++ kwin/options.cpp +@@ -71,6 +71,9 @@ unsigned long Options::updateSettings() + altTabStyle = KDE; // what a default :-) + if ( val == "CDE" ) + altTabStyle = CDE; ++ ++ separateScreenFocus = config->readBoolEntry( "SeparateScreenFocus", false ); ++ activeMouseScreen = config->readBoolEntry( "ActiveMouseScreen", focusPolicy != ClickToFocus ); + + rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE); + +@@ -91,9 +94,10 @@ unsigned long Options::updateSettings() + delete gc; + + placement = Placement::policyFromString( config->readEntry("Placement"), true ); ++ xineramaPlacementScreen = KCLAMP( config->readNumEntry( "XineramaPlacementScreen", -1 ), ++ -1, qApp->desktop()->numScreens() - 1 ); + + animateShade = config->readBoolEntry("AnimateShade", TRUE ); +- + animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE ); + animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 ); + +Index: kwin/placement.cpp +=================================================================== +--- kwin/placement.cpp.orig ++++ kwin/placement.cpp +@@ -473,7 +473,7 @@ void Placement::placeOnMainWindow(Client + it != mainwindows.end(); + ++it ) + { +- if( (*it)->isSpecialWindow()) ++ if( mainwindows.count() > 1 && (*it)->isSpecialWindow()) + continue; // don't consider toolbars etc when placing + ++mains_count; + place_on2 = *it; +@@ -502,6 +502,11 @@ void Placement::placeOnMainWindow(Client + } + place_on = place_on2; // use the only window filtered together with 'mains_count' + } ++ if( place_on->isDesktop()) ++ { ++ place( c, area, Centered ); ++ return; ++ } + QRect geom = c->geometry(); + geom.moveCenter( place_on->geometry().center()); + c->move( geom.topLeft()); +Index: kwin/client.cpp +=================================================================== +--- kwin/client.cpp.orig ++++ kwin/client.cpp +@@ -1255,6 +1255,20 @@ bool Client::isOnCurrentDesktop() const + return isOnDesktop( workspace()->currentDesktop()); + } + ++int Client::screen() const ++ { ++ if( !options->xineramaEnabled ) ++ return 0; ++ return workspace()->screenNumber( geometry().center()); ++ } ++ ++bool Client::isOnScreen( int screen ) const ++ { ++ if( !options->xineramaEnabled ) ++ return screen == 0; ++ return workspace()->screenGeometry( screen ).intersects( geometry()); ++ } ++ + // performs activation and/or raising of the window + void Client::takeActivity( int flags, bool handled, allowed_t ) + { +Index: kwin/popupinfo.cpp +=================================================================== +--- kwin/popupinfo.cpp.orig ++++ kwin/popupinfo.cpp +@@ -25,7 +25,6 @@ License. See the file "COPYING" for the + #include <klocale.h> + #include <qapplication.h> + #include <qdesktopwidget.h> +-#include <qcursor.h> + #include <kstringhandler.h> + #include <kglobalsettings.h> + +@@ -34,8 +33,8 @@ License. See the file "COPYING" for the + namespace KWinInternal + { + +-PopupInfo::PopupInfo( const char *name ) +- : QWidget( 0, name ) ++PopupInfo::PopupInfo( Workspace* ws, const char *name ) ++ : QWidget( 0, name ), workspace( ws ) + { + m_infoString = ""; + m_shown = false; +@@ -60,7 +59,7 @@ PopupInfo::~PopupInfo() + */ + void PopupInfo::reset() + { +- QRect r = KGlobalSettings::desktopGeometry(QCursor::pos()); ++ QRect r = workspace->screenGeometry( workspace->activeScreen()); + + int w = fontMetrics().width( m_infoString ) + 30; + +Index: kwin/geometry.cpp +=================================================================== +--- kwin/geometry.cpp.orig ++++ kwin/geometry.cpp +@@ -211,14 +211,11 @@ void Workspace::updateClientArea() + + \sa geometry() + */ +-QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const ++QRect Workspace::clientArea( clientAreaOption opt, int screen, int desktop ) const + { + if( desktop == NETWinInfo::OnAllDesktops || desktop == 0 ) + desktop = currentDesktop(); + QDesktopWidget *desktopwidget = KApplication::desktop(); +- int screen = desktopwidget->isVirtualDesktop() ? desktopwidget->screenNumber( p ) : desktopwidget->primaryScreen(); +- if( screen < 0 ) +- screen = desktopwidget->primaryScreen(); + QRect sarea = screenarea // may be NULL during KWin initialization + ? screenarea[ desktop ][ screen ] + : desktopwidget->screenGeometry( screen ); +@@ -263,11 +260,21 @@ QRect Workspace::clientArea( clientAreaO + return QRect(); + } + ++QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const ++ { ++ QDesktopWidget *desktopwidget = KApplication::desktop(); ++ int screen = desktopwidget->screenNumber( p ); ++ if( screen < 0 ) ++ screen = desktopwidget->primaryScreen(); ++ return clientArea( opt, screen, desktop ); ++ } ++ + QRect Workspace::clientArea( clientAreaOption opt, const Client* c ) const + { + return clientArea( opt, c->geometry().center(), c->desktop()); + } + ++ + /*! + Client \a c is moved around to position \a pos. This gives the + workspace the opportunity to interveniate and to implement +@@ -896,10 +903,6 @@ void Client::checkWorkspacePosition() + setGeometry( area ); + return; + } +- if( maximizeMode() != MaximizeRestore ) +- // TODO update geom_restore? +- changeMaximize( false, false, true ); // adjust size +- + if( isFullScreen()) + { + QRect area = workspace()->clientArea( FullScreenArea, this ); +@@ -926,6 +929,10 @@ void Client::checkWorkspacePosition() + return; + } + ++ if( maximizeMode() != MaximizeRestore ) ++ // TODO update geom_restore? ++ changeMaximize( false, false, true ); // adjust size ++ + if( !isShade()) // TODO + { + int old_diff_x = workarea_diff_x; +@@ -1722,6 +1729,7 @@ void Client::setGeometry( int x, int y, + sendSyntheticConfigureNotify(); + updateWindowRules(); + checkMaximizeGeometry(); ++ workspace()->checkActiveScreen( this ); + } + + void Client::plainResize( int w, int h, ForceGeometry_t force ) +@@ -1775,6 +1783,7 @@ void Client::plainResize( int w, int h, + sendSyntheticConfigureNotify(); + updateWindowRules(); + checkMaximizeGeometry(); ++ workspace()->checkActiveScreen( this ); + } + + /*! +@@ -1795,6 +1804,7 @@ void Client::move( int x, int y, ForceGe + sendSyntheticConfigureNotify(); + updateWindowRules(); + checkMaximizeGeometry(); ++ workspace()->checkActiveScreen( this ); + } + + +Index: kwin/kwin.kcfg +=================================================================== +--- kwin/kwin.kcfg.orig ++++ kwin/kwin.kcfg +@@ -60,6 +60,9 @@ + <entry key="IgnorePositionClasses" type="StringList" /> + <entry key="KillPingTimeout" type="Int" /> + <entry key="ShowDesktopIsMinimizeAll" type="Bool" /> ++ <entry key="SeparateScreenFocus" type="Bool" /> ++ <entry key="ActiveMouseScreen" type="Bool" /> ++ <entry key="XineramaPlacementScreen" type="Int" /> + </group> + + <group name="WM" > +Index: kwin/client.h +=================================================================== +--- kwin/client.h.orig ++++ kwin/client.h +@@ -118,6 +118,9 @@ class Client : public QObject, public KD + bool isOnCurrentDesktop() const; + bool isOnAllDesktops() const; + void setOnAllDesktops( bool set ); ++ ++ bool isOnScreen( int screen ) const; // true if it's at least partially there ++ int screen() const; // the screen where the center is + + // !isMinimized() && not hidden, i.e. normally visible on some virtual desktop + bool isShown( bool shaded_is_shown ) const; +Index: kwin/manage.cpp +=================================================================== +--- kwin/manage.cpp.orig ++++ kwin/manage.cpp +@@ -166,7 +166,7 @@ bool Client::manage( Window w, bool isMa + it != mainclients.end(); + ++it ) + { +- if( (*it)->isSpecialWindow()) ++ if( mainclients.count() > 1 && (*it)->isSpecialWindow()) + continue; // don't consider toolbars etc when placing + maincl = *it; + if( (*it)->isOnCurrentDesktop()) +@@ -202,9 +202,14 @@ bool Client::manage( Window w, bool isMa + if( isMapped || session ) + area = workspace()->clientArea( FullArea, geom.center(), desktop()); + else if( options->xineramaPlacementEnabled ) +- area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop()); ++ { ++ int screen = options->xineramaPlacementScreen; ++ if( screen == -1 ) // active screen ++ screen = asn_data.xinerama() == -1 ? workspace()->activeScreen() : asn_data.xinerama(); ++ area = workspace()->clientArea( PlacementArea, workspace()->screenGeometry( screen ).center(), desktop()); ++ } + else +- area = workspace()->clientArea( PlacementArea, geom.center(), desktop()); ++ area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop()); + + if( int type = checkFullScreenHack( geom )) + { +Index: kwin/workspace.cpp +=================================================================== +--- kwin/workspace.cpp.orig ++++ kwin/workspace.cpp +@@ -82,6 +82,7 @@ Workspace::Workspace( bool restore ) + QObject (0, "workspace"), + current_desktop (0), + number_of_desktops(0), ++ active_screen (0), + active_popup( NULL ), + active_popup_client( NULL ), + desktop_widget (0), +@@ -202,7 +203,7 @@ Workspace::Workspace( bool restore ) + client_keys = new KGlobalAccel( this ); + initShortcuts(); + tab_box = new TabBox( this ); +- popupinfo = new PopupInfo( ); ++ popupinfo = new PopupInfo( this ); + + init(); + +@@ -304,6 +305,7 @@ void Workspace::init() + NET::WM2ExtendedStrut | + NET::WM2KDETemporaryRules | + NET::WM2ShowingDesktop | ++ NET::WM2FullPlacement | + NET::WM2DesktopLayout | + 0 + , +@@ -1541,6 +1543,83 @@ void Workspace::setDesktopLayout( int, i + { // DCOP-only, unused + } + ++int Workspace::numScreens() const ++ { ++ if( !options->xineramaEnabled ) ++ return 0; ++ return qApp->desktop()->numScreens(); ++ } ++ ++int Workspace::activeScreen() const ++ { ++ if( !options->xineramaEnabled ) ++ return 0; ++ if( !options->activeMouseScreen ) ++ { ++ if( activeClient() != NULL && !activeClient()->isOnScreen( active_screen )) ++ return qApp->desktop()->screenNumber( activeClient()->geometry().center()); ++ return active_screen; ++ } ++ return qApp->desktop()->screenNumber( QCursor::pos()); ++ } ++ ++// check whether a client moved completely out of what's considered the active screen, ++// if yes, set a new active screen ++void Workspace::checkActiveScreen( const Client* c ) ++ { ++ if( !options->xineramaEnabled ) ++ return; ++ if( !c->isActive()) ++ return; ++ if( !c->isOnScreen( active_screen )) ++ active_screen = c->screen(); ++ } ++ ++// called e.g. when a user clicks on a window, set active screen to be the screen ++// where the click occured ++void Workspace::setActiveScreenMouse( QPoint mousepos ) ++ { ++ if( !options->xineramaEnabled ) ++ return; ++ active_screen = qApp->desktop()->screenNumber( mousepos ); ++ } ++ ++QRect Workspace::screenGeometry( int screen ) const ++ { ++ if( !options->xineramaEnabled ) ++ return qApp->desktop()->geometry(); ++ return qApp->desktop()->screenGeometry( screen ); ++ } ++ ++int Workspace::screenNumber( QPoint pos ) const ++ { ++ if( !options->xineramaEnabled ) ++ return 0; ++ return qApp->desktop()->screenNumber( pos ); ++ } ++ ++ ++void Workspace::sendClientToScreen( Client* c, int screen ) ++ { ++ if( c->screen() == screen ) // don't use isOnScreen(), that's true even when only parti ++ // ally ++ return; ++ GeometryUpdatesPostponer blocker( c ); ++ QRect old_sarea = clientArea( MaximizeArea, c ); ++ QRect sarea = clientArea( MaximizeArea, screen, c->desktop()); ++ c->setGeometry( sarea.x() - old_sarea.x() + c->x(), sarea.y() - old_sarea.y() + c->y(), ++ c->size().width(), c->size().height()); ++ c->checkWorkspacePosition(); ++ ClientList transients_stacking_order = ensureStackingOrder( c->transients()); ++ for( ClientList::ConstIterator it = transients_stacking_order.begin(); ++ it != transients_stacking_order.end(); ++ ++it ) ++ sendClientToScreen( *it, screen ); ++ if( c->isActive()) ++ active_screen = screen; ++ } ++ ++ + void Workspace::updateDesktopLayout() + { + // rootInfo->desktopLayoutCorner(); // I don't find this worth bothering, feel free to +Index: kwin/activation.cpp +=================================================================== +--- kwin/activation.cpp.orig ++++ kwin/activation.cpp +@@ -360,6 +360,8 @@ void Workspace::takeActivity( Client* c, + return; + } + c->takeActivity( flags, handled, Allowed ); ++ if( !c->isOnScreen( active_screen )) ++ active_screen = c->screen(); + } + + void Workspace::handleTakeActivity( Client* c, Time /*timestamp*/, int flags ) +@@ -413,6 +415,13 @@ bool Workspace::activateNextClient( Clie + { + if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop()) + continue; ++ if( options->separateScreenFocus ) ++ { ++ if( c != NULL && !(*it)->isOnScreen( c->screen())) ++ continue; ++ if( c == NULL && !(*it)->isOnScreen( activeScreen())) ++ continue; ++ } + if( mainwindows.contains( *it )) + { + get_focus = *it; +@@ -438,6 +447,31 @@ bool Workspace::activateNextClient( Clie + return true; + } + ++void Workspace::setCurrentScreen( int new_screen ) ++ { ++ if (new_screen < 0 || new_screen > numScreens()) ++ return; ++ if ( !options->focusPolicyIsReasonable()) ++ return; ++ closeActivePopup(); ++ Client* get_focus = NULL; ++ for( ClientList::ConstIterator it = focus_chain[currentDesktop()].fromLast(); ++ it != focus_chain[currentDesktop()].end(); ++ --it ) ++ { ++ if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop()) ++ continue; ++ if( !(*it)->screen() == new_screen ) ++ continue; ++ get_focus = *it; ++ break; ++ } ++ if( get_focus == NULL ) ++ get_focus = findDesktop( true, currentDesktop()); ++ if( get_focus != NULL && get_focus != mostRecentlyActivatedClient()) ++ requestFocus( get_focus ); ++ active_screen = new_screen; ++ } + + void Workspace::gotFocusIn( const Client* c ) + { +@@ -860,6 +894,8 @@ void Client::startupIdChanged() + desktop = asn_data.desktop(); + if( !isOnAllDesktops()) + workspace()->sendClientToDesktop( this, desktop, true ); ++ if( asn_data.xinerama() != -1 ) ++ workspace()->sendClientToScreen( this, asn_data.xinerama()); + Time timestamp = asn_id.timestamp(); + if( timestamp == 0 && asn_data.timestamp() != -1U ) + timestamp = asn_data.timestamp(); +Index: kwin/kwinbindings.cpp +=================================================================== +--- kwin/kwinbindings.cpp.orig ++++ kwin/kwinbindings.cpp +@@ -104,6 +104,15 @@ + DEF( I18N_NOOP("Window One Desktop to the Left"), 0, 0, slotWindowToDesktopLeft() ); + DEF( I18N_NOOP("Window One Desktop Up"), 0, 0, slotWindowToDesktopUp() ); + DEF( I18N_NOOP("Window One Desktop Down"), 0, 0, slotWindowToDesktopDown() ); ++ DEF( I18N_NOOP("Window to Screen 0"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 1"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 2"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 3"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 4"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 5"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 6"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Screen 7"), 0, 0, slotWindowToScreen(int) ); ++ DEF( I18N_NOOP("Window to Next Screen"), 0, 0, slotWindowToNextScreen() ); + + keys->insert( "Group:Desktop Switching", i18n("Desktop Switching") ); + DEF( I18N_NOOP("Switch to Desktop 1"), CTRL+Qt::Key_F1, WIN+Qt::Key_F1, slotSwitchToDesktop(int) ); +@@ -132,6 +141,15 @@ + DEF( I18N_NOOP("Switch One Desktop to the Left"), 0, 0, slotSwitchDesktopLeft() ); + DEF( I18N_NOOP("Switch One Desktop Up"), 0, 0, slotSwitchDesktopUp() ); + DEF( I18N_NOOP("Switch One Desktop Down"), 0, 0, slotSwitchDesktopDown() ); ++ DEF( I18N_NOOP("Switch to Screen 0"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 1"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 2"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 3"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 4"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 5"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 6"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Screen 7"), 0, 0, slotSwitchToScreen(int) ); ++ DEF( I18N_NOOP("Switch to Next Screen"), 0, 0, slotSwitchToNextScreen() ); + + keys->insert( "Group:Miscellaneous", i18n("Miscellaneous") ); + DEF( I18N_NOOP("Mouse Emulation"), ALT+Qt::Key_F12, 0, slotMouseEmulation() ); diff --git a/opensuse/core/tdebase/zh_TW.flag.png b/opensuse/core/tdebase/zh_TW.flag.png Binary files differnew file mode 100644 index 000000000..472e3376a --- /dev/null +++ b/opensuse/core/tdebase/zh_TW.flag.png |