summaryrefslogtreecommitdiffstats
path: root/opensuse
diff options
context:
space:
mode:
authorRobert Xu <robxu9@gmail.com>2011-08-24 17:26:04 -0400
committerRobert Xu <robxu9@gmail.com>2011-08-24 17:26:04 -0400
commit93c66bf8bb8ac0124ae1800cbaaeb814742bfac5 (patch)
tree2551422a7981b35684110fae090223b7a1b6d73f /opensuse
parent425774d7d1d663e08bb06050924f2eeca9147bba (diff)
downloadtde-packaging-93c66bf8bb8ac0124ae1800cbaaeb814742bfac5.tar.gz
tde-packaging-93c66bf8bb8ac0124ae1800cbaaeb814742bfac5.zip
dbus-1-tqt -> libdbus-tqt-1-0 AND tdelibs import (unchanged)
Diffstat (limited to 'opensuse')
-rw-r--r--opensuse/dbus-1-tqt/baselibs.conf1
-rwxr-xr-xopensuse/gentarball4
-rw-r--r--opensuse/libdbus-tqt-1-0/README.VERSION (renamed from opensuse/dbus-1-tqt/README.VERSION)0
-rw-r--r--opensuse/libdbus-tqt-1-0/baselibs.conf1
-rw-r--r--opensuse/libdbus-tqt-1-0/dbus-qt3-compile-fix-thoenig-01.patch (renamed from opensuse/dbus-1-tqt/dbus-qt3-compile-fix-thoenig-01.patch)0
-rw-r--r--opensuse/libdbus-tqt-1-0/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch (renamed from opensuse/dbus-1-tqt/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch)0
-rw-r--r--opensuse/libdbus-tqt-1-0/dbus-tqt-0.62.tar.bz2bin0 -> 187005 bytes
-rw-r--r--opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.changes (renamed from opensuse/dbus-1-tqt/dbus-1-tqt.changes)5
-rw-r--r--opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.spec (renamed from opensuse/dbus-1-tqt/dbus-1-tqt.spec)14
-rw-r--r--opensuse/tdebase/3_5_BRANCH.diff1176
-rw-r--r--opensuse/tdebase/access.diff51
-rw-r--r--opensuse/tdebase/applet-lock-logout.diff122
-rw-r--r--opensuse/tdebase/arts-start-on-demand.diff98
-rw-r--r--opensuse/tdebase/artwork.diff35
-rw-r--r--opensuse/tdebase/autorun.patch27
-rw-r--r--opensuse/tdebase/background_default.diff13
-rw-r--r--opensuse/tdebase/baselibs.conf2
-rw-r--r--opensuse/tdebase/beagle-0.3.diff21
-rw-r--r--opensuse/tdebase/bnc.desktop8
-rw-r--r--opensuse/tdebase/bnc584223.diff189
-rw-r--r--opensuse/tdebase/clock-applet-style.diff22
-rw-r--r--opensuse/tdebase/clock-suse-integrate.diff288
-rw-r--r--opensuse/tdebase/console8x16.pcf.gzbin0 -> 12244 bytes
-rw-r--r--opensuse/tdebase/default-kdeprintfax.diff13
-rw-r--r--opensuse/tdebase/default_fonts.diff25
-rw-r--r--opensuse/tdebase/devmon-automounter.sh1086
-rw-r--r--opensuse/tdebase/dont-always-start-kaccess.diff66
-rw-r--r--opensuse/tdebase/fileshareset.8.gzbin0 -> 1086 bytes
-rw-r--r--opensuse/tdebase/fileshareset2.tar.bz2bin0 -> 8677 bytes
-rw-r--r--opensuse/tdebase/fix-desktop-icons.diff250
-rw-r--r--opensuse/tdebase/fix-kcontrol-yast.diff63
-rw-r--r--opensuse/tdebase/fix-kio-smb-auth.diff13
-rw-r--r--opensuse/tdebase/fix-lockup-from-gnome-apps.diff20
-rw-r--r--opensuse/tdebase/fix_default_theme_reset.diff59
-rw-r--r--opensuse/tdebase/gcc44.diff20
-rw-r--r--opensuse/tdebase/hide-only-showin-entries.diff14
-rw-r--r--opensuse/tdebase/improve-panelservicemenu-geticonset.diff32
-rw-r--r--opensuse/tdebase/ioslaveinfo-icon.diff13
-rw-r--r--opensuse/tdebase/kcheckpass-pam-11.06
-rw-r--r--opensuse/tdebase/kcheckpass-pam-11.15
-rw-r--r--opensuse/tdebase/kcheckpass-pam-legacy7
-rw-r--r--opensuse/tdebase/kcheckpass.8.gzbin0 -> 836 bytes
-rw-r--r--opensuse/tdebase/kcminit-ignore-arts.diff14
-rw-r--r--opensuse/tdebase/kcmkdm-default-grub.diff13
-rw-r--r--opensuse/tdebase/kcmsamba_log.diff31
-rw-r--r--opensuse/tdebase/kcmshell_use_kde-sound.diff11
-rw-r--r--opensuse/tdebase/kcontrol-energy.diff167
-rw-r--r--opensuse/tdebase/kcontrol.diff11
-rw-r--r--opensuse/tdebase/kde3-session-restore.diff12
-rw-r--r--opensuse/tdebase/kde3-session.diff13
-rw-r--r--opensuse/tdebase/kdebase_khc_rellinks.diff606
-rw-r--r--opensuse/tdebase/kdebase_networkstatus_branch.diff36
-rw-r--r--opensuse/tdebase/kdeeject.diff58
-rw-r--r--opensuse/tdebase/kdesktop_icons.diff311
-rw-r--r--opensuse/tdebase/kdesu-remember-keep-password.diff18
-rw-r--r--opensuse/tdebase/kdesud-security.diff21
-rw-r--r--opensuse/tdebase/kdm-admin-mode.diff424
-rw-r--r--opensuse/tdebase/kdm-aliasing.diff11
-rw-r--r--opensuse/tdebase/kdm-align-userlist-labels.diff46
-rw-r--r--opensuse/tdebase/kdm-all-users-nopass.diff34
-rw-r--r--opensuse/tdebase/kdm-audit-log.diff190
-rw-r--r--opensuse/tdebase/kdm-color-scheme.diff28
-rw-r--r--opensuse/tdebase/kdm-consolekit.diff822
-rw-r--r--opensuse/tdebase/kdm-cope-with-new-grub.diff27
-rw-r--r--opensuse/tdebase/kdm-make_it_cool.diff1534
-rw-r--r--opensuse/tdebase/kdm-mark_autologin.diff13
-rw-r--r--opensuse/tdebase/kdm-pam-np-legacy7
-rw-r--r--opensuse/tdebase/kdm-relaxed-auth.diff22
-rw-r--r--opensuse/tdebase/kdm-suspend-hal.diff331
-rw-r--r--opensuse/tdebase/kdm-sysconfig-values.diff737
-rw-r--r--opensuse/tdebase/kdm-use-rpmoptflags.diff29
-rw-r--r--opensuse/tdebase/kdm-wordbreak.diff22
-rw-r--r--opensuse/tdebase/kfontinst.diff10
-rw-r--r--opensuse/tdebase/khelpcenter-beagle.diff172
-rw-r--r--opensuse/tdebase/khelpcenter-delayed-indexcheck.cpp23
-rw-r--r--opensuse/tdebase/khelpcenter-gnome-support-legacy.patch327
-rw-r--r--opensuse/tdebase/khelpcenter-gnome-support.patch335
-rw-r--r--opensuse/tdebase/khelpcenter-localindices.patch41
-rw-r--r--opensuse/tdebase/khelpcenter-use-suseconfig-indexer.diff25
-rw-r--r--opensuse/tdebase/khelpcenter-use-susehelp.diff13
-rw-r--r--opensuse/tdebase/khotkeys-multimedia-action.diff345
-rw-r--r--opensuse/tdebase/khotkeys-multimedia-action2.diff81
-rw-r--r--opensuse/tdebase/kicker-defaults.diff57
-rw-r--r--opensuse/tdebase/kickerrc63
-rw-r--r--opensuse/tdebase/kickoff-beagle.diff1329
-rw-r--r--opensuse/tdebase/kickoff-data.tar.bz2bin0 -> 581352 bytes
-rw-r--r--opensuse/tdebase/kickoff-install-software.diff25
-rw-r--r--opensuse/tdebase/kickoff-kcm.diff217
-rw-r--r--opensuse/tdebase/kickoff.diff9812
-rw-r--r--opensuse/tdebase/kio-media-errorhandling.diff18
-rw-r--r--opensuse/tdebase/klipperrc.diff22
-rw-r--r--opensuse/tdebase/kmenu-search-fs20050503-fixed.diff342
-rw-r--r--opensuse/tdebase/kmenu-search-slowdown-fix.diff129
-rw-r--r--opensuse/tdebase/knetattach-show.diff7
-rw-r--r--opensuse/tdebase/kompmgr_use_defaults.diff34
-rw-r--r--opensuse/tdebase/konq-combo-editor.diff42
-rw-r--r--opensuse/tdebase/konsole-schema-update.diff33
-rw-r--r--opensuse/tdebase/konsole_keytab.diff17
-rw-r--r--opensuse/tdebase/kpamgreeter.diff852
-rw-r--r--opensuse/tdebase/krandr-0.5.2.1.diff.bz2bin0 -> 22752 bytes
-rw-r--r--opensuse/tdebase/kscreensaver-random-NG.diff189
-rw-r--r--opensuse/tdebase/ksmserver-defaulttohalt.diff13
-rw-r--r--opensuse/tdebase/ksmserver-kdeinit.diff67
-rw-r--r--opensuse/tdebase/ksmserver-suspend.diff233
-rw-r--r--opensuse/tdebase/ksmserver-timed.diff700
-rw-r--r--opensuse/tdebase/ksmserver-tooltips.diff38
-rw-r--r--opensuse/tdebase/ksplashml.patch19
-rw-r--r--opensuse/tdebase/ksysguard-slp-ratelimit.diff15
-rw-r--r--opensuse/tdebase/ksysguardd-openslp.diff288
-rw-r--r--opensuse/tdebase/ksysguardd.init80
-rw-r--r--opensuse/tdebase/ksysguardd.reg12
-rw-r--r--opensuse/tdebase/kwinbindings.diff43
-rw-r--r--opensuse/tdebase/kxkb-include-latin-layout.diff14
-rw-r--r--opensuse/tdebase/less_verbal_kdesu.patch26
-rw-r--r--opensuse/tdebase/libkonq-kdemm.diff117
-rw-r--r--opensuse/tdebase/locale-dont-show-flag.diff33
-rw-r--r--opensuse/tdebase/lock-xvkbd.diff380
-rw-r--r--opensuse/tdebase/lowdiskspace.patch413
-rw-r--r--opensuse/tdebase/mach_blass.diff160
-rw-r--r--opensuse/tdebase/make-wallpapers-hideable.diff48
-rw-r--r--opensuse/tdebase/media-cryptosupport.diff31
-rw-r--r--opensuse/tdebase/media-iPod.diff26
-rw-r--r--opensuse/tdebase/media-teardown_crypto.diff175
-rw-r--r--opensuse/tdebase/media_suse.diff49
-rw-r--r--opensuse/tdebase/mediamanager-mount-point-utf8.diff13
-rw-r--r--opensuse/tdebase/minicli-combo-editor.diff34
-rw-r--r--opensuse/tdebase/mp3-info.tar.bz2bin0 -> 2606 bytes
-rw-r--r--opensuse/tdebase/mtab-reenable.patch153
-rw-r--r--opensuse/tdebase/non-fast-malloc.diff15
-rw-r--r--opensuse/tdebase/nsplugin-Preference.diff13
-rw-r--r--opensuse/tdebase/nsplugin-init-gtk.diff49
-rw-r--r--opensuse/tdebase/openssl1.patch40
-rw-r--r--opensuse/tdebase/optional-compmgr.diff32
-rw-r--r--opensuse/tdebase/quick_browser_menu.diff30
-rw-r--r--opensuse/tdebase/remove-beagle-stuff.diff34
-rw-r--r--opensuse/tdebase/restore-description-parens.diff13
-rw-r--r--opensuse/tdebase/rotate-wacom-pointers.diff291
-rw-r--r--opensuse/tdebase/runupdater.patch133
-rw-r--r--opensuse/tdebase/select-wm-gui.diff635
-rw-r--r--opensuse/tdebase/short-menus.diff209
-rw-r--r--opensuse/tdebase/show-konqueror-in-menu.diff30
-rw-r--r--opensuse/tdebase/simplify-randr-settings.diff91
-rw-r--r--opensuse/tdebase/sourceforge.desktop7
-rw-r--r--opensuse/tdebase/spellcheck-default-utf8.diff13
-rw-r--r--opensuse/tdebase/startkde.diff80
-rw-r--r--opensuse/tdebase/startkde.suse.sh140
-rw-r--r--opensuse/tdebase/stopkde.suse.sh13
-rw-r--r--opensuse/tdebase/suse_default_move.diff83
-rw-r--r--opensuse/tdebase/suspend-kpowersave.diff178
-rw-r--r--opensuse/tdebase/suspend-unmount.diff179
-rw-r--r--opensuse/tdebase/system-folder_man.diff13
-rw-r--r--opensuse/tdebase/systray_order.diff162
-rw-r--r--opensuse/tdebase/taskbar.patch29
-rw-r--r--opensuse/tdebase/tdebase.changes5422
-rw-r--r--opensuse/tdebase/tdebase.fillup25
-rw-r--r--opensuse/tdebase/tdebase.spec1851
-rw-r--r--opensuse/tdebase/teach-minicli-lock.diff30
-rw-r--r--opensuse/tdebase/uninit.diff10
-rw-r--r--opensuse/tdebase/use-full-hinting-by-default.diff35
-rw-r--r--opensuse/tdebase/use-pam-before-classic.diff17
-rw-r--r--opensuse/tdebase/wizard_small.pngbin0 -> 40259 bytes
-rw-r--r--opensuse/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff44
-rw-r--r--opensuse/tdebase/xcursor.diff36
-rw-r--r--opensuse/tdebase/xinerama.patch951
-rw-r--r--opensuse/tdebase/zh_TW.flag.pngbin0 -> 175 bytes
-rw-r--r--opensuse/tdelibs/kdelibs-3.5.12.99.tar.bz2bin0 -> 14993135 bytes
-rw-r--r--opensuse/tdelibs/tdelibs.spec3
167 files changed, 38035 insertions, 9 deletions
diff --git a/opensuse/dbus-1-tqt/baselibs.conf b/opensuse/dbus-1-tqt/baselibs.conf
deleted file mode 100644
index eadc4f615..000000000
--- a/opensuse/dbus-1-tqt/baselibs.conf
+++ /dev/null
@@ -1 +0,0 @@
-dbus-1-tqt
diff --git a/opensuse/gentarball b/opensuse/gentarball
index 9ef2732f7..e9498c0ba 100755
--- a/opensuse/gentarball
+++ b/opensuse/gentarball
@@ -49,7 +49,7 @@ if [ "$SELECTION" = "1" ]; then
clear
echo "Dependencies: Select what you want us to generate."
echo "(1) libtqt4"
- echo "(2) dbus-1-tqt"
+ echo "(2) libdbus-tqt-1-0"
echo "(3) libdbus-1-tqt-0"
echo "(4) arts"
read CHOICE
@@ -66,9 +66,11 @@ elif [ "$SELECTION" = "2" ]; then
clear
echo "Main: Select what you want us to generate."
echo "(1) tdelibs"
+ echo "(2) tdebase"
read CHOICE
if [ "$CHOICE" = "1" ]; then NAME='kdelibs';
+ elif [ "$CHOICE" = "2" ]; then NAME='kdebase';
else
echo "Invalid, bye." && exit 1
fi
diff --git a/opensuse/dbus-1-tqt/README.VERSION b/opensuse/libdbus-tqt-1-0/README.VERSION
index 3167a4836..3167a4836 100644
--- a/opensuse/dbus-1-tqt/README.VERSION
+++ b/opensuse/libdbus-tqt-1-0/README.VERSION
diff --git a/opensuse/libdbus-tqt-1-0/baselibs.conf b/opensuse/libdbus-tqt-1-0/baselibs.conf
new file mode 100644
index 000000000..245517231
--- /dev/null
+++ b/opensuse/libdbus-tqt-1-0/baselibs.conf
@@ -0,0 +1 @@
+libdbus-tqt-1-0
diff --git a/opensuse/dbus-1-tqt/dbus-qt3-compile-fix-thoenig-01.patch b/opensuse/libdbus-tqt-1-0/dbus-qt3-compile-fix-thoenig-01.patch
index 00b8b6026..00b8b6026 100644
--- a/opensuse/dbus-1-tqt/dbus-qt3-compile-fix-thoenig-01.patch
+++ b/opensuse/libdbus-tqt-1-0/dbus-qt3-compile-fix-thoenig-01.patch
diff --git a/opensuse/dbus-1-tqt/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch b/opensuse/libdbus-tqt-1-0/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch
index 3cc726de1..3cc726de1 100644
--- a/opensuse/dbus-1-tqt/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch
+++ b/opensuse/libdbus-tqt-1-0/dbus-qt3-do-not-close-shared-connection-thoenig-01.patch
diff --git a/opensuse/libdbus-tqt-1-0/dbus-tqt-0.62.tar.bz2 b/opensuse/libdbus-tqt-1-0/dbus-tqt-0.62.tar.bz2
new file mode 100644
index 000000000..b56ca56e6
--- /dev/null
+++ b/opensuse/libdbus-tqt-1-0/dbus-tqt-0.62.tar.bz2
Binary files differ
diff --git a/opensuse/dbus-1-tqt/dbus-1-tqt.changes b/opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.changes
index 152c611cd..c3d66974d 100644
--- a/opensuse/dbus-1-tqt/dbus-1-tqt.changes
+++ b/opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.changes
@@ -1,4 +1,9 @@
-------------------------------------------------------------------
+Wed Aug 24 19:36:38 UTC 2011 - rxu@lincomlinux.org
+
+- fix naming error: libdbus-tqt-1-0
+
+-------------------------------------------------------------------
Sat Aug 13 16:49:42 UTC 2011 - rxu@lincomlinux.org
- upgrade to trinity dbus-tqt and adjust accordingly
diff --git a/opensuse/dbus-1-tqt/dbus-1-tqt.spec b/opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.spec
index 1ab86c544..85cfb9d28 100644
--- a/opensuse/dbus-1-tqt/dbus-1-tqt.spec
+++ b/opensuse/libdbus-tqt-1-0/libdbus-tqt-1-0.spec
@@ -18,7 +18,7 @@
# norootforbuild
-Name: dbus-1-tqt
+Name: libdbus-tqt-1-0
BuildRequires: dbus-1 dbus-1-devel libtqt4-devel cmake
URL: http://dbus.freedesktop.org/
License: GPLv2+
@@ -33,13 +33,15 @@ Patch0: dbus-qt3-compile-fix-thoenig-01.patch
Patch1: dbus-qt3-do-not-close-shared-connection-thoenig-01.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: dbus-1 >= %( echo `rpm -q --queryformat '%{VERSION}-%{RELEASE}' dbus-1`)
+Provides: dbus-1-tqt
%package devel
License: Other uncritical OpenSource License
Summary: Developer package for TQt/KDE bindings for D-Bus
Requires: dbus-1 >= %( echo `rpm -q --queryformat '%{VERSION}-%{RELEASE}' dbus-1`)
Requires: dbus-1-devel >= %( echo `rpm -q --queryformat '%{VERSION}-%{RELEASE}' dbus-1-devel`)
-Requires: dbus-1-tqt = %{version}
+Requires: %{name} = %{version}
+Provides: dbus-1-tqt-devel
AutoReqProv: on
Group: Development/Libraries/TDE
@@ -89,8 +91,8 @@ Authors:
%prep
%setup -n dbus-tqt-%{version} -q
-%patch0 -p0
-%patch1 -p0
+#%patch0 -p0
+#%patch1 -p0
%build
RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -fstack-protector -fno-strict-aliasing -fPIC"
@@ -114,6 +116,7 @@ cd build
make
%install
+cd build
make DESTDIR=%{buildroot} install
%post
@@ -127,7 +130,7 @@ make DESTDIR=%{buildroot} install
%files
%defattr(-, root, root)
-%{_libdir}/libdbus-tqt-1.so.1*
+%{_libdir}/libdbus-tqt-1.so.0*
%files devel
%defattr(-, root, root)
@@ -139,5 +142,6 @@ make DESTDIR=%{buildroot} install
%{_includedir}/dbus-1.0/dbus/server.h
%{_libdir}/libdbus-tqt-1.la
%{_libdir}/libdbus-tqt-1.so
+%{_libdir}/pkgconfig/dbus-tqt.pc
%changelog
diff --git a/opensuse/tdebase/3_5_BRANCH.diff b/opensuse/tdebase/3_5_BRANCH.diff
new file mode 100644
index 000000000..bff4be17d
--- /dev/null
+++ b/opensuse/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/tdebase/access.diff b/opensuse/tdebase/access.diff
new file mode 100644
index 000000000..9f105550b
--- /dev/null
+++ b/opensuse/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/tdebase/applet-lock-logout.diff b/opensuse/tdebase/applet-lock-logout.diff
new file mode 100644
index 000000000..75363e768
--- /dev/null
+++ b/opensuse/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/tdebase/arts-start-on-demand.diff b/opensuse/tdebase/arts-start-on-demand.diff
new file mode 100644
index 000000000..27fcc2292
--- /dev/null
+++ b/opensuse/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/tdebase/artwork.diff b/opensuse/tdebase/artwork.diff
new file mode 100644
index 000000000..ba13e5757
--- /dev/null
+++ b/opensuse/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/tdebase/autorun.patch b/opensuse/tdebase/autorun.patch
new file mode 100644
index 000000000..962740cdc
--- /dev/null
+++ b/opensuse/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/tdebase/background_default.diff b/opensuse/tdebase/background_default.diff
new file mode 100644
index 000000000..71f9a96bb
--- /dev/null
+++ b/opensuse/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/tdebase/baselibs.conf b/opensuse/tdebase/baselibs.conf
new file mode 100644
index 000000000..29e28ab1d
--- /dev/null
+++ b/opensuse/tdebase/baselibs.conf
@@ -0,0 +1,2 @@
+kdebase3
+kdebase3-runtime
diff --git a/opensuse/tdebase/beagle-0.3.diff b/opensuse/tdebase/beagle-0.3.diff
new file mode 100644
index 000000000..6e65be590
--- /dev/null
+++ b/opensuse/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/tdebase/bnc.desktop b/opensuse/tdebase/bnc.desktop
new file mode 100644
index 000000000..c5db233cf
--- /dev/null
+++ b/opensuse/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/tdebase/bnc584223.diff b/opensuse/tdebase/bnc584223.diff
new file mode 100644
index 000000000..370abf150
--- /dev/null
+++ b/opensuse/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/tdebase/clock-applet-style.diff b/opensuse/tdebase/clock-applet-style.diff
new file mode 100644
index 000000000..42c768337
--- /dev/null
+++ b/opensuse/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/tdebase/clock-suse-integrate.diff b/opensuse/tdebase/clock-suse-integrate.diff
new file mode 100644
index 000000000..a4d24dff8
--- /dev/null
+++ b/opensuse/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/tdebase/console8x16.pcf.gz b/opensuse/tdebase/console8x16.pcf.gz
new file mode 100644
index 000000000..db4be9f47
--- /dev/null
+++ b/opensuse/tdebase/console8x16.pcf.gz
Binary files differ
diff --git a/opensuse/tdebase/default-kdeprintfax.diff b/opensuse/tdebase/default-kdeprintfax.diff
new file mode 100644
index 000000000..ed686b4a7
--- /dev/null
+++ b/opensuse/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/tdebase/default_fonts.diff b/opensuse/tdebase/default_fonts.diff
new file mode 100644
index 000000000..4300b5aed
--- /dev/null
+++ b/opensuse/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/tdebase/devmon-automounter.sh b/opensuse/tdebase/devmon-automounter.sh
new file mode 100644
index 000000000..ff2de18f1
--- /dev/null
+++ b/opensuse/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/tdebase/dont-always-start-kaccess.diff b/opensuse/tdebase/dont-always-start-kaccess.diff
new file mode 100644
index 000000000..f50747274
--- /dev/null
+++ b/opensuse/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/tdebase/fileshareset.8.gz b/opensuse/tdebase/fileshareset.8.gz
new file mode 100644
index 000000000..c311d10b3
--- /dev/null
+++ b/opensuse/tdebase/fileshareset.8.gz
Binary files differ
diff --git a/opensuse/tdebase/fileshareset2.tar.bz2 b/opensuse/tdebase/fileshareset2.tar.bz2
new file mode 100644
index 000000000..5e26bb796
--- /dev/null
+++ b/opensuse/tdebase/fileshareset2.tar.bz2
Binary files differ
diff --git a/opensuse/tdebase/fix-desktop-icons.diff b/opensuse/tdebase/fix-desktop-icons.diff
new file mode 100644
index 000000000..27d83f685
--- /dev/null
+++ b/opensuse/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/tdebase/fix-kcontrol-yast.diff b/opensuse/tdebase/fix-kcontrol-yast.diff
new file mode 100644
index 000000000..5902d904d
--- /dev/null
+++ b/opensuse/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/tdebase/fix-kio-smb-auth.diff b/opensuse/tdebase/fix-kio-smb-auth.diff
new file mode 100644
index 000000000..d591be038
--- /dev/null
+++ b/opensuse/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/tdebase/fix-lockup-from-gnome-apps.diff b/opensuse/tdebase/fix-lockup-from-gnome-apps.diff
new file mode 100644
index 000000000..05fc4313b
--- /dev/null
+++ b/opensuse/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/tdebase/fix_default_theme_reset.diff b/opensuse/tdebase/fix_default_theme_reset.diff
new file mode 100644
index 000000000..2b2a6805a
--- /dev/null
+++ b/opensuse/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/tdebase/gcc44.diff b/opensuse/tdebase/gcc44.diff
new file mode 100644
index 000000000..999b5f3ca
--- /dev/null
+++ b/opensuse/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/tdebase/hide-only-showin-entries.diff b/opensuse/tdebase/hide-only-showin-entries.diff
new file mode 100644
index 000000000..f403d38c5
--- /dev/null
+++ b/opensuse/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/tdebase/improve-panelservicemenu-geticonset.diff b/opensuse/tdebase/improve-panelservicemenu-geticonset.diff
new file mode 100644
index 000000000..842976d5a
--- /dev/null
+++ b/opensuse/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/tdebase/ioslaveinfo-icon.diff b/opensuse/tdebase/ioslaveinfo-icon.diff
new file mode 100644
index 000000000..5f64f89d9
--- /dev/null
+++ b/opensuse/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/tdebase/kcheckpass-pam-11.0 b/opensuse/tdebase/kcheckpass-pam-11.0
new file mode 100644
index 000000000..eae973612
--- /dev/null
+++ b/opensuse/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/tdebase/kcheckpass-pam-11.1 b/opensuse/tdebase/kcheckpass-pam-11.1
new file mode 100644
index 000000000..c6a7c9c90
--- /dev/null
+++ b/opensuse/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/tdebase/kcheckpass-pam-legacy b/opensuse/tdebase/kcheckpass-pam-legacy
new file mode 100644
index 000000000..87df34589
--- /dev/null
+++ b/opensuse/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/tdebase/kcheckpass.8.gz b/opensuse/tdebase/kcheckpass.8.gz
new file mode 100644
index 000000000..81f8aae2a
--- /dev/null
+++ b/opensuse/tdebase/kcheckpass.8.gz
Binary files differ
diff --git a/opensuse/tdebase/kcminit-ignore-arts.diff b/opensuse/tdebase/kcminit-ignore-arts.diff
new file mode 100644
index 000000000..2c987aae1
--- /dev/null
+++ b/opensuse/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/tdebase/kcmkdm-default-grub.diff b/opensuse/tdebase/kcmkdm-default-grub.diff
new file mode 100644
index 000000000..1d758eb57
--- /dev/null
+++ b/opensuse/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/tdebase/kcmsamba_log.diff b/opensuse/tdebase/kcmsamba_log.diff
new file mode 100644
index 000000000..e29ca1e13
--- /dev/null
+++ b/opensuse/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/tdebase/kcmshell_use_kde-sound.diff b/opensuse/tdebase/kcmshell_use_kde-sound.diff
new file mode 100644
index 000000000..ac6d434e4
--- /dev/null
+++ b/opensuse/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/tdebase/kcontrol-energy.diff b/opensuse/tdebase/kcontrol-energy.diff
new file mode 100644
index 000000000..b98a648bc
--- /dev/null
+++ b/opensuse/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/tdebase/kcontrol.diff b/opensuse/tdebase/kcontrol.diff
new file mode 100644
index 000000000..ab23e34ba
--- /dev/null
+++ b/opensuse/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/tdebase/kde3-session-restore.diff b/opensuse/tdebase/kde3-session-restore.diff
new file mode 100644
index 000000000..6ade7063b
--- /dev/null
+++ b/opensuse/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/tdebase/kde3-session.diff b/opensuse/tdebase/kde3-session.diff
new file mode 100644
index 000000000..763879088
--- /dev/null
+++ b/opensuse/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/tdebase/kdebase_khc_rellinks.diff b/opensuse/tdebase/kdebase_khc_rellinks.diff
new file mode 100644
index 000000000..e11269095
--- /dev/null
+++ b/opensuse/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>&amp;File</text>
+@@ -23,8 +23,8 @@
+ </Menu>
+ <Menu name="go_web">
+ <text>&amp;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/tdebase/kdebase_networkstatus_branch.diff b/opensuse/tdebase/kdebase_networkstatus_branch.diff
new file mode 100644
index 000000000..8329d3cd2
--- /dev/null
+++ b/opensuse/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/tdebase/kdeeject.diff b/opensuse/tdebase/kdeeject.diff
new file mode 100644
index 000000000..d22e67fb6
--- /dev/null
+++ b/opensuse/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/tdebase/kdesktop_icons.diff b/opensuse/tdebase/kdesktop_icons.diff
new file mode 100644
index 000000000..5d208b0dd
--- /dev/null
+++ b/opensuse/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/tdebase/kdesu-remember-keep-password.diff b/opensuse/tdebase/kdesu-remember-keep-password.diff
new file mode 100644
index 000000000..29e9002d8
--- /dev/null
+++ b/opensuse/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/tdebase/kdesud-security.diff b/opensuse/tdebase/kdesud-security.diff
new file mode 100644
index 000000000..40b44de71
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-admin-mode.diff b/opensuse/tdebase/kdm-admin-mode.diff
new file mode 100644
index 000000000..6028d7698
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-aliasing.diff b/opensuse/tdebase/kdm-aliasing.diff
new file mode 100644
index 000000000..73fc86e54
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-align-userlist-labels.diff b/opensuse/tdebase/kdm-align-userlist-labels.diff
new file mode 100644
index 000000000..65accc55f
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-all-users-nopass.diff b/opensuse/tdebase/kdm-all-users-nopass.diff
new file mode 100644
index 000000000..612c6a553
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-audit-log.diff b/opensuse/tdebase/kdm-audit-log.diff
new file mode 100644
index 000000000..de571e44d
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-color-scheme.diff b/opensuse/tdebase/kdm-color-scheme.diff
new file mode 100644
index 000000000..f45486ad1
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-consolekit.diff b/opensuse/tdebase/kdm-consolekit.diff
new file mode 100644
index 000000000..9b4df34bc
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-cope-with-new-grub.diff b/opensuse/tdebase/kdm-cope-with-new-grub.diff
new file mode 100644
index 000000000..cf28cf9be
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-make_it_cool.diff b/opensuse/tdebase/kdm-make_it_cool.diff
new file mode 100644
index 000000000..fb1f5b076
--- /dev/null
+++ b/opensuse/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( &copy, 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/tdebase/kdm-mark_autologin.diff b/opensuse/tdebase/kdm-mark_autologin.diff
new file mode 100644
index 000000000..a913f5a94
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-pam-np-legacy b/opensuse/tdebase/kdm-pam-np-legacy
new file mode 100644
index 000000000..5d139e0bb
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-relaxed-auth.diff b/opensuse/tdebase/kdm-relaxed-auth.diff
new file mode 100644
index 000000000..c94fa2b5d
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-suspend-hal.diff b/opensuse/tdebase/kdm-suspend-hal.diff
new file mode 100644
index 000000000..711e1c114
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-sysconfig-values.diff b/opensuse/tdebase/kdm-sysconfig-values.diff
new file mode 100644
index 000000000..c3b9f8af9
--- /dev/null
+++ b/opensuse/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 &amp; 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/tdebase/kdm-use-rpmoptflags.diff b/opensuse/tdebase/kdm-use-rpmoptflags.diff
new file mode 100644
index 000000000..85a03e02b
--- /dev/null
+++ b/opensuse/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/tdebase/kdm-wordbreak.diff b/opensuse/tdebase/kdm-wordbreak.diff
new file mode 100644
index 000000000..9c50ecdc9
--- /dev/null
+++ b/opensuse/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/tdebase/kfontinst.diff b/opensuse/tdebase/kfontinst.diff
new file mode 100644
index 000000000..51c5e59b6
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-beagle.diff b/opensuse/tdebase/khelpcenter-beagle.diff
new file mode 100644
index 000000000..6b4314e6a
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-delayed-indexcheck.cpp b/opensuse/tdebase/khelpcenter-delayed-indexcheck.cpp
new file mode 100644
index 000000000..37c3f195c
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-gnome-support-legacy.patch b/opensuse/tdebase/khelpcenter-gnome-support-legacy.patch
new file mode 100644
index 000000000..fb9a11ee4
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-gnome-support.patch b/opensuse/tdebase/khelpcenter-gnome-support.patch
new file mode 100644
index 000000000..d98ae01dc
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-localindices.patch b/opensuse/tdebase/khelpcenter-localindices.patch
new file mode 100644
index 000000000..a2b41a78a
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-use-suseconfig-indexer.diff b/opensuse/tdebase/khelpcenter-use-suseconfig-indexer.diff
new file mode 100644
index 000000000..e63e26ff7
--- /dev/null
+++ b/opensuse/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/tdebase/khelpcenter-use-susehelp.diff b/opensuse/tdebase/khelpcenter-use-susehelp.diff
new file mode 100644
index 000000000..6c130a6d1
--- /dev/null
+++ b/opensuse/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/tdebase/khotkeys-multimedia-action.diff b/opensuse/tdebase/khotkeys-multimedia-action.diff
new file mode 100644
index 000000000..050e31d60
--- /dev/null
+++ b/opensuse/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/tdebase/khotkeys-multimedia-action2.diff b/opensuse/tdebase/khotkeys-multimedia-action2.diff
new file mode 100644
index 000000000..9f995b1ab
--- /dev/null
+++ b/opensuse/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/tdebase/kicker-defaults.diff b/opensuse/tdebase/kicker-defaults.diff
new file mode 100644
index 000000000..a92cae562
--- /dev/null
+++ b/opensuse/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/tdebase/kickerrc b/opensuse/tdebase/kickerrc
new file mode 100644
index 000000000..e5d6351a7
--- /dev/null
+++ b/opensuse/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/tdebase/kickoff-beagle.diff b/opensuse/tdebase/kickoff-beagle.diff
new file mode 100644
index 000000000..a850e78ce
--- /dev/null
+++ b/opensuse/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/tdebase/kickoff-data.tar.bz2 b/opensuse/tdebase/kickoff-data.tar.bz2
new file mode 100644
index 000000000..9841a0aa0
--- /dev/null
+++ b/opensuse/tdebase/kickoff-data.tar.bz2
Binary files differ
diff --git a/opensuse/tdebase/kickoff-install-software.diff b/opensuse/tdebase/kickoff-install-software.diff
new file mode 100644
index 000000000..f053a45fb
--- /dev/null
+++ b/opensuse/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/tdebase/kickoff-kcm.diff b/opensuse/tdebase/kickoff-kcm.diff
new file mode 100644
index 000000000..1dd87afde
--- /dev/null
+++ b/opensuse/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/tdebase/kickoff.diff b/opensuse/tdebase/kickoff.diff
new file mode 100644
index 000000000..e2d73f567
--- /dev/null
+++ b/opensuse/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&nbsp;<b>%1</b>&nbsp;on&nbsp;<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&amp;nbsp;&lt;b&gt;user&lt;/b&gt;&amp;nbsp;on&amp;nbsp;&lt;b&gt;host&lt;/b&gt;</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/tdebase/kio-media-errorhandling.diff b/opensuse/tdebase/kio-media-errorhandling.diff
new file mode 100644
index 000000000..fd9420f3b
--- /dev/null
+++ b/opensuse/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/tdebase/klipperrc.diff b/opensuse/tdebase/klipperrc.diff
new file mode 100644
index 000000000..d18b4852f
--- /dev/null
+++ b/opensuse/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/tdebase/kmenu-search-fs20050503-fixed.diff b/opensuse/tdebase/kmenu-search-fs20050503-fixed.diff
new file mode 100644
index 000000000..aa36d6a22
--- /dev/null
+++ b/opensuse/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/tdebase/kmenu-search-slowdown-fix.diff b/opensuse/tdebase/kmenu-search-slowdown-fix.diff
new file mode 100644
index 000000000..83c771db2
--- /dev/null
+++ b/opensuse/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/tdebase/knetattach-show.diff b/opensuse/tdebase/knetattach-show.diff
new file mode 100644
index 000000000..0f24370fd
--- /dev/null
+++ b/opensuse/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/tdebase/kompmgr_use_defaults.diff b/opensuse/tdebase/kompmgr_use_defaults.diff
new file mode 100644
index 000000000..00863fc66
--- /dev/null
+++ b/opensuse/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/tdebase/konq-combo-editor.diff b/opensuse/tdebase/konq-combo-editor.diff
new file mode 100644
index 000000000..8a205fb9f
--- /dev/null
+++ b/opensuse/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/tdebase/konsole-schema-update.diff b/opensuse/tdebase/konsole-schema-update.diff
new file mode 100644
index 000000000..dbba940dd
--- /dev/null
+++ b/opensuse/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/tdebase/konsole_keytab.diff b/opensuse/tdebase/konsole_keytab.diff
new file mode 100644
index 000000000..18698e2b2
--- /dev/null
+++ b/opensuse/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/tdebase/kpamgreeter.diff b/opensuse/tdebase/kpamgreeter.diff
new file mode 100644
index 000000000..ff8241623
--- /dev/null
+++ b/opensuse/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/tdebase/krandr-0.5.2.1.diff.bz2 b/opensuse/tdebase/krandr-0.5.2.1.diff.bz2
new file mode 100644
index 000000000..5e35b382b
--- /dev/null
+++ b/opensuse/tdebase/krandr-0.5.2.1.diff.bz2
Binary files differ
diff --git a/opensuse/tdebase/kscreensaver-random-NG.diff b/opensuse/tdebase/kscreensaver-random-NG.diff
new file mode 100644
index 000000000..389babf13
--- /dev/null
+++ b/opensuse/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/tdebase/ksmserver-defaulttohalt.diff b/opensuse/tdebase/ksmserver-defaulttohalt.diff
new file mode 100644
index 000000000..71a8a5037
--- /dev/null
+++ b/opensuse/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/tdebase/ksmserver-kdeinit.diff b/opensuse/tdebase/ksmserver-kdeinit.diff
new file mode 100644
index 000000000..a21b92dc8
--- /dev/null
+++ b/opensuse/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/tdebase/ksmserver-suspend.diff b/opensuse/tdebase/ksmserver-suspend.diff
new file mode 100644
index 000000000..ef7a88036
--- /dev/null
+++ b/opensuse/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/tdebase/ksmserver-timed.diff b/opensuse/tdebase/ksmserver-timed.diff
new file mode 100644
index 000000000..89f4a7004
--- /dev/null
+++ b/opensuse/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/tdebase/ksmserver-tooltips.diff b/opensuse/tdebase/ksmserver-tooltips.diff
new file mode 100644
index 000000000..c847907af
--- /dev/null
+++ b/opensuse/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/tdebase/ksplashml.patch b/opensuse/tdebase/ksplashml.patch
new file mode 100644
index 000000000..5d3ca0cf7
--- /dev/null
+++ b/opensuse/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/tdebase/ksysguard-slp-ratelimit.diff b/opensuse/tdebase/ksysguard-slp-ratelimit.diff
new file mode 100644
index 000000000..7859ed096
--- /dev/null
+++ b/opensuse/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/tdebase/ksysguardd-openslp.diff b/opensuse/tdebase/ksysguardd-openslp.diff
new file mode 100644
index 000000000..4cb0e3795
--- /dev/null
+++ b/opensuse/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/tdebase/ksysguardd.init b/opensuse/tdebase/ksysguardd.init
new file mode 100644
index 000000000..3be2cba3b
--- /dev/null
+++ b/opensuse/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/tdebase/ksysguardd.reg b/opensuse/tdebase/ksysguardd.reg
new file mode 100644
index 000000000..889cb252f
--- /dev/null
+++ b/opensuse/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/tdebase/kwinbindings.diff b/opensuse/tdebase/kwinbindings.diff
new file mode 100644
index 000000000..51069e5b3
--- /dev/null
+++ b/opensuse/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/tdebase/kxkb-include-latin-layout.diff b/opensuse/tdebase/kxkb-include-latin-layout.diff
new file mode 100644
index 000000000..a0b09a3c5
--- /dev/null
+++ b/opensuse/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/tdebase/less_verbal_kdesu.patch b/opensuse/tdebase/less_verbal_kdesu.patch
new file mode 100644
index 000000000..fd5375836
--- /dev/null
+++ b/opensuse/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/tdebase/libkonq-kdemm.diff b/opensuse/tdebase/libkonq-kdemm.diff
new file mode 100644
index 000000000..6eb45eab4
--- /dev/null
+++ b/opensuse/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/tdebase/locale-dont-show-flag.diff b/opensuse/tdebase/locale-dont-show-flag.diff
new file mode 100644
index 000000000..2c0a57454
--- /dev/null
+++ b/opensuse/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/tdebase/lock-xvkbd.diff b/opensuse/tdebase/lock-xvkbd.diff
new file mode 100644
index 000000000..9b5faae8a
--- /dev/null
+++ b/opensuse/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/tdebase/lowdiskspace.patch b/opensuse/tdebase/lowdiskspace.patch
new file mode 100644
index 000000000..a2ee05f54
--- /dev/null
+++ b/opensuse/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/tdebase/mach_blass.diff b/opensuse/tdebase/mach_blass.diff
new file mode 100644
index 000000000..8ea798d13
--- /dev/null
+++ b/opensuse/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, &copy);
++ //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/tdebase/make-wallpapers-hideable.diff b/opensuse/tdebase/make-wallpapers-hideable.diff
new file mode 100644
index 000000000..d59494940
--- /dev/null
+++ b/opensuse/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/tdebase/media-cryptosupport.diff b/opensuse/tdebase/media-cryptosupport.diff
new file mode 100644
index 000000000..e9b4fb58d
--- /dev/null
+++ b/opensuse/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/tdebase/media-iPod.diff b/opensuse/tdebase/media-iPod.diff
new file mode 100644
index 000000000..c5f1f8a24
--- /dev/null
+++ b/opensuse/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/tdebase/media-teardown_crypto.diff b/opensuse/tdebase/media-teardown_crypto.diff
new file mode 100644
index 000000000..f713cffc7
--- /dev/null
+++ b/opensuse/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/tdebase/media_suse.diff b/opensuse/tdebase/media_suse.diff
new file mode 100644
index 000000000..8583f03d2
--- /dev/null
+++ b/opensuse/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/tdebase/mediamanager-mount-point-utf8.diff b/opensuse/tdebase/mediamanager-mount-point-utf8.diff
new file mode 100644
index 000000000..87db2b9ef
--- /dev/null
+++ b/opensuse/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/tdebase/minicli-combo-editor.diff b/opensuse/tdebase/minicli-combo-editor.diff
new file mode 100644
index 000000000..698668ec1
--- /dev/null
+++ b/opensuse/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/tdebase/mp3-info.tar.bz2 b/opensuse/tdebase/mp3-info.tar.bz2
new file mode 100644
index 000000000..f6cf95bcd
--- /dev/null
+++ b/opensuse/tdebase/mp3-info.tar.bz2
Binary files differ
diff --git a/opensuse/tdebase/mtab-reenable.patch b/opensuse/tdebase/mtab-reenable.patch
new file mode 100644
index 000000000..1593a560d
--- /dev/null
+++ b/opensuse/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/tdebase/non-fast-malloc.diff b/opensuse/tdebase/non-fast-malloc.diff
new file mode 100644
index 000000000..c3f36be87
--- /dev/null
+++ b/opensuse/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/tdebase/nsplugin-Preference.diff b/opensuse/tdebase/nsplugin-Preference.diff
new file mode 100644
index 000000000..3e3bcca05
--- /dev/null
+++ b/opensuse/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/tdebase/nsplugin-init-gtk.diff b/opensuse/tdebase/nsplugin-init-gtk.diff
new file mode 100644
index 000000000..882c12443
--- /dev/null
+++ b/opensuse/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/tdebase/openssl1.patch b/opensuse/tdebase/openssl1.patch
new file mode 100644
index 000000000..f1d250c44
--- /dev/null
+++ b/opensuse/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/tdebase/optional-compmgr.diff b/opensuse/tdebase/optional-compmgr.diff
new file mode 100644
index 000000000..d0affeed9
--- /dev/null
+++ b/opensuse/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/tdebase/quick_browser_menu.diff b/opensuse/tdebase/quick_browser_menu.diff
new file mode 100644
index 000000000..dd955115c
--- /dev/null
+++ b/opensuse/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/tdebase/remove-beagle-stuff.diff b/opensuse/tdebase/remove-beagle-stuff.diff
new file mode 100644
index 000000000..94b243d9d
--- /dev/null
+++ b/opensuse/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/tdebase/restore-description-parens.diff b/opensuse/tdebase/restore-description-parens.diff
new file mode 100644
index 000000000..f575dbcb2
--- /dev/null
+++ b/opensuse/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/tdebase/rotate-wacom-pointers.diff b/opensuse/tdebase/rotate-wacom-pointers.diff
new file mode 100644
index 000000000..a8d9c7f96
--- /dev/null
+++ b/opensuse/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/tdebase/runupdater.patch b/opensuse/tdebase/runupdater.patch
new file mode 100644
index 000000000..3dcc4c550
--- /dev/null
+++ b/opensuse/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/tdebase/select-wm-gui.diff b/opensuse/tdebase/select-wm-gui.diff
new file mode 100644
index 000000000..823262962
--- /dev/null
+++ b/opensuse/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/tdebase/short-menus.diff b/opensuse/tdebase/short-menus.diff
new file mode 100644
index 000000000..784c75ebb
--- /dev/null
+++ b/opensuse/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/tdebase/show-konqueror-in-menu.diff b/opensuse/tdebase/show-konqueror-in-menu.diff
new file mode 100644
index 000000000..a5f4b9ab3
--- /dev/null
+++ b/opensuse/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/tdebase/simplify-randr-settings.diff b/opensuse/tdebase/simplify-randr-settings.diff
new file mode 100644
index 000000000..93add22fd
--- /dev/null
+++ b/opensuse/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/tdebase/sourceforge.desktop b/opensuse/tdebase/sourceforge.desktop
new file mode 100644
index 000000000..4a218ad84
--- /dev/null
+++ b/opensuse/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/tdebase/spellcheck-default-utf8.diff b/opensuse/tdebase/spellcheck-default-utf8.diff
new file mode 100644
index 000000000..57d49fab6
--- /dev/null
+++ b/opensuse/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/tdebase/startkde.diff b/opensuse/tdebase/startkde.diff
new file mode 100644
index 000000000..c7cd061ce
--- /dev/null
+++ b/opensuse/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/tdebase/startkde.suse.sh b/opensuse/tdebase/startkde.suse.sh
new file mode 100644
index 000000000..28c200695
--- /dev/null
+++ b/opensuse/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/tdebase/stopkde.suse.sh b/opensuse/tdebase/stopkde.suse.sh
new file mode 100644
index 000000000..54f7de3a3
--- /dev/null
+++ b/opensuse/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/tdebase/suse_default_move.diff b/opensuse/tdebase/suse_default_move.diff
new file mode 100644
index 000000000..1eb938e20
--- /dev/null
+++ b/opensuse/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/tdebase/suspend-kpowersave.diff b/opensuse/tdebase/suspend-kpowersave.diff
new file mode 100644
index 000000000..13aaa131c
--- /dev/null
+++ b/opensuse/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/tdebase/suspend-unmount.diff b/opensuse/tdebase/suspend-unmount.diff
new file mode 100644
index 000000000..dabdd1271
--- /dev/null
+++ b/opensuse/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/tdebase/system-folder_man.diff b/opensuse/tdebase/system-folder_man.diff
new file mode 100644
index 000000000..98fd9e08f
--- /dev/null
+++ b/opensuse/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/tdebase/systray_order.diff b/opensuse/tdebase/systray_order.diff
new file mode 100644
index 000000000..b864afc8e
--- /dev/null
+++ b/opensuse/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/tdebase/taskbar.patch b/opensuse/tdebase/taskbar.patch
new file mode 100644
index 000000000..f8e526e6d
--- /dev/null
+++ b/opensuse/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/tdebase/tdebase.changes b/opensuse/tdebase/tdebase.changes
new file mode 100644
index 000000000..5c3add7de
--- /dev/null
+++ b/opensuse/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/tdebase/tdebase.fillup b/opensuse/tdebase/tdebase.fillup
new file mode 100644
index 000000000..d2e2beeb8
--- /dev/null
+++ b/opensuse/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/tdebase/tdebase.spec b/opensuse/tdebase/tdebase.spec
new file mode 100644
index 000000000..52d6c3c81
--- /dev/null
+++ b/opensuse/tdebase/tdebase.spec
@@ -0,0 +1,1851 @@
+#
+# spec file for package kdebase3
+#
+# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# 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 via http://bugs.opensuse.org/
+#
+
+# norootforbuild
+
+%if %suse_version < 1210 || 0%{?is_kde_kde3} > 0
+%define with_hal 1
+%else
+%define with_hal 0
+%endif
+
+Name: kdebase3
+BuildRequires: OpenEXR-devel cups-devel db-devel doxygen graphviz kdelibs3-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: unsermake xorg-x11-libfontenc-devel
+BuildRequires: liblazy-devel
+%if %suse_version >= 1130
+BuildRequires: libusb-compat-devel
+%endif
+%if 0%{?with_hal} > 0
+BuildRequires: hal-devel
+Provides: kdebase3-with-hal-enabled
+%endif
+BuildRequires: fdupes libbz2-devel
+%ifnarch s390 s390x
+BuildRequires: libsensors4-devel
+%endif
+%define qt_path /usr/lib/qt3
+%define kde_path /opt/kde3
+Provides: windowmanager kfontinst kdebase3-konqueror kdebase3-khotkeys
+Obsoletes: kfontinst kdebase3-konqueror kdebase3-khotkeys
+# bug437293
+%ifarch ppc64
+Obsoletes: kdebase3-64bit
+%endif
+#
+Requires: kdelibs3 >= %( echo `rpm -q --queryformat '%{VERSION}' kdelibs3`)
+Requires: xorg-x11 misc-console-font
+Recommends: kdelibs3_doc
+Recommends: gdb
+PreReq: fileshareset
+%define fileshare_prefix %{_prefix}
+Conflicts: kdebase3-SuSE <= 9.0
+PreReq: /bin/sh fileutils permissions
+%if %suse_version < 1120
+Requires: kdebase3-apps kdebase3-workspace
+%endif
+%if %suse_version > 1130
+Provides: kdebase3-beagle = 3.5.10
+Obsoletes: kdebase3-beagle <= 3.5.10
+%endif
+License: GPLv2+
+Group: System/GUI/KDE
+Summary: The KDE Core Components
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+Url: http://www.kde.org/
+Version: 3.5.10.1
+Release: 17
+%define kde_version 3.5.10
+Requires: kdebase3-runtime == %{version}
+Source0: kdebase-%{kde_version}.tar.bz2
+Source1: baselibs.conf
+Source3: startkde.suse.sh
+Source4: kdebase3.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 kdebase, one of the basic packages of the K
+Desktop Environment. It contains, among others, kwin (the KDE window
+manager), Konqueror (the KDE Web browser), and KControl (the
+configuration program)
+
+This package is needed if you want to use the KDE Desktop. It is not
+needed if you only want to start some KDE applications.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package -n misc-console-font
+License: GPLv2+
+Group: System/GUI/KDE
+Summary: A font for terminal usage
+
+%description -n misc-console-font
+This package contains the Misc Console font as shipped with KDE.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package runtime
+License: GPLv2+
+Summary: Runtime Dependencies of KDE3 Applications
+Group: System/GUI/KDE
+Provides: kio_fish
+Obsoletes: kio_fish
+Provides: kdebase3:/opt/kde3/%_lib/libkonq.so.4
+
+%description runtime
+This package contains runtime dependencies of KDE3 applications like
+KIO-slaves.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package workspace
+License: GPLv2+
+Summary: Workspace Components of KDE3 Desktop
+Group: System/GUI/KDE
+Requires: kdebase3 == %{version}
+Provides: kdebase3:/opt/kde3/bin/kicker
+Recommends: kdebase3-ksysguardd == %{version}
+%if 0%{?with_hal} > 0
+Recommends: kdebase3-with-hal-enabled
+%endif
+
+%description workspace
+This package contains the wrkspace components of kdebase3 like
+kdesktop, kicker and kwin.
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package apps
+License: GPLv2+
+Summary: Major Applications KDE3 Desktop
+Group: System/GUI/KDE
+Requires: kdebase3 == %{version}
+Provides: kdebase3:/opt/kde3/bin/konsole
+
+%description apps
+This package contains the major applications kdebase3 like
+Kate, Konqueror and KWrite.
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package devel
+License: GPLv2+
+Requires: kdelibs3-devel kdebase3 = %version kdebase3-apps = %version kdebase3-runtime = %version kdebase3-workspace = %version
+Summary: KDE Base Package: Base, Build Environment
+Group: System/GUI/KDE
+
+%description devel
+This package contains KDEbase, one of the basic packages of the K
+Desktop Environment. It contains, among other things, KWIN, the KDE
+window manager; Konqueror, the KDE web and file browser; and KControl,
+the KDE configuration program.
+
+This package is not needed if you do not want to compile high level KDE
+applications.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package kdm
+License: GPLv2+
+# usesubdirs kdm
+Summary: The KDE login and display manager
+Provides: kdebase3:/opt/kde3/bin/kdm
+Provides: kdebase:/opt/kde2/bin/kdm
+Provides: kdebase3-kdm-SLD:/opt/kde3/bin/kdm
+Requires: xorg-x11
+Requires: kdebase3-runtime >= %version
+Group: System/GUI/KDE
+PreReq: %fillup_prereq /bin/grep
+
+%description kdm
+This package contains kdm, the login and session manager for KDE.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package samba
+License: GPLv2+
+# usesubdirs kioslave/smb kcontrol/samba
+Summary: KDE Base package: Windows Connection Module
+Group: System/GUI/KDE
+
+%description samba
+This package provides the "smb://" protocol, to connect to and from
+Windows and Samba shares.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%package extra
+License: GPLv2+
+# usesubdirs kpersonalizer kcontrol/thememgr
+Summary: KDE Base package: Extra Applications
+Group: System/GUI/KDE
+
+%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:
+--------
+ The KDE Team <kde@kde.org>
+
+%package nsplugin
+License: GPLv2+
+%ifarch x86_64 ppc64 s390x ia64
+Requires: nspluginwrapper
+%endif
+Supplements: kdebase3 >= %version
+Requires: kdebase3 = %version
+Summary: Netscape plugin support for KDE
+Group: System/GUI/KDE
+
+%description nsplugin
+This package contains support for Netscape plug-ins in konqueror. You
+have to enable JavaScript for this.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+
+%package ksysguardd
+License: GPLv2+
+PreReq: %insserv_prereq %fillup_prereq aaa_base
+Summary: KDE base package: ksysguard daemon
+Group: System/GUI/KDE
+Provides: kdebase4-workspace-ksysguardd
+
+%description ksysguardd
+This package contains the ksysguard daemon. It is needed for ksysguard.
+
+This package can be installed on servers without any other KDE packages
+to guard the system from remote computers.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+
+%package session
+License: GPLv2+
+Summary: The KDE Session
+Group: System/GUI/KDE
+Provides: kdebase3:/usr/bin/kde
+Requires: kdebase3-workspace
+
+%description session
+This package contains the startup scripts necessary to start a KDE
+session from kdm.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%if %suse_version < 1140
+
+%package beagle
+License: GPLv2+
+Summary: Beagle dependent plugins for KDE desktop
+Group: System/GUI/KDE
+Requires: beagle >= 0.3.0
+Requires: kdebase3-workspace = %version
+Supplements: packageand(kdebase3-session:beagle)
+BuildRequires: libbeagle-devel
+
+%description beagle
+This package contains kdebase plugins which provide additional search
+functionality via Beagle.
+
+
+
+Authors:
+--------
+ The KDE Team <kde@kde.org>
+
+%endif
+
+%package -n fileshareset
+License: GPLv2+
+Summary: Set and list fileshares
+Group: System/Management
+Version: 2.0
+Release: 578
+
+%description -n fileshareset
+This package contains the the fileshareset 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>
+
+%define sysconfdir /etc
+
+%prep
+%setup -q -b 8 -b 13 -n kdebase-%{kde_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
+%if %suse_version > 1010
+%patch83
+%patch77
+%endif
+%patch200
+%patch215
+%patch84
+%patch61
+%patch120
+%patch22
+%patch92
+%patch88
+%if %suse_version > 1020
+%patch96
+%else
+%patch996
+%endif
+# xcursor
+%patch99
+%ifnarch %ix86 x86_64
+%patch80
+%endif
+%patch62
+%patch69
+%patch104
+%patch105
+%patch111
+%patch114
+%patch116
+%patch117
+%patch123
+%patch126
+%patch131
+%patch141 -p1
+%patch127
+%patch144
+%patch145
+%patch149
+%patch155
+%patch156
+%patch157
+%patch160
+%if %suse_version > 1010
+%patch161
+pushd kicker
+%patch162
+pushd ../kcontrol/kicker
+%patch158
+popd
+popd
+%if %suse_version > 1010
+%if %suse_version < 1140
+%patch159
+%endif
+%endif
+%patch165
+%patch166
+%patch167
+tar xvfj %SOURCE20
+%endif
+%patch163
+%patch125
+%patch169
+%patch170
+%patch171
+%patch172
+%patch173
+%patch174
+%patch177
+%patch179
+%patch180
+%if %suse_version > 1010
+%patch189
+%endif
+%patch190
+%patch195
+%if %suse_version > 1020
+%patch198
+%patch199
+%endif
+%patch203
+%patch204
+%patch205
+%patch207
+%patch208
+%patch209
+%patch211
+%patch212
+%patch214
+pushd kcontrol
+%patch216
+popd
+%patch217
+%patch218
+%patch219
+%patch220
+%patch222
+%patch225
+%patch197
+%patch206
+%patch227
+%patch228
+%if %suse_version > 1030
+%if %suse_version < 1140
+pushd kicker
+%patch1629
+popd
+%patch229
+%patch230
+%endif
+%endif
+%patch231
+%patch232
+%patch233
+%patch234
+%patch235
+%patch236
+%if %suse_version > 1010
+%patch237
+%endif
+%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
+. /etc/opt/kde3/common_options
+cd ../fileshareset2
+aclocal
+autoconf
+automake -a -c
+cd ../kdebase-%{kde_version}
+update_admin
+
+%build
+. /etc/opt/kde3/common_options
+DEBUG="--disable-debug"
+FINAL="--enable-final"
+PARANOIA=""
+%ifnarch s390
+PARANOIA="--with-cdparanoia"
+%endif
+ LDAP="--with-ldap"
+%if %suse_version > 1010
+ MOTIF_INCLUDE="/usr/include"
+X_SERVER=/usr/bin/X RUN_KAPPFINDER=no \
+%else
+ MOTIF_INCLUDE="/usr/X11R6/include"
+X_SERVER=/usr/X11R6/bin/X RUN_KAPPFINDER=no \
+%endif
+./configure \
+ $configkde \
+ $PARANOIA \
+ $LDAP \
+ $FLAGS \
+ $XINERAMA \
+%if %suse_version > 1010
+ --with-motif-libraries=/usr/%{_lib}/ \
+%else
+ --with-motif-libraries=/usr/X11R6/%{_lib}/ \
+%endif
+ --with-motif-includes=$MOTIF_INCLUDE \
+ --with-samba-libs \
+ --with-pam=xdm \
+ --with-kdm-xconsole \
+ --with-kdm-pam=xdm \
+ --with-kcp-pam=kcheckpass \
+ --with-kss-pam=kcheckpass
+ do_make %{?_smp_mflags}
+cd ../fileshareset2
+ ./configure --prefix=%{fileshare_prefix}
+ make %{?_smp_mflags}
+
+%install
+. /etc/opt/kde3/common_options
+# 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
+do_make DESTDIR=$RPM_BUILD_ROOT $INSTALL_TARGET
+rm $RPM_BUILD_ROOT/opt/kde3/share/applnk/System/kmenuedit.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/applnk/System/kpersonalizer.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/applnk/Utilities/kpager.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/applnk/Internet/keditbookmarks.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/applnk/Toys/ktip.desktop
+install -m 0644 %SOURCE12 $RPM_BUILD_ROOT/opt/kde3/share/fonts/
+%if %suse_version > 1100
+install -D -m 0644 %SOURCE21 $RPM_BUILD_ROOT/etc/pam.d/kcheckpass
+%else
+%if %suse_version > 1010
+install -D -m 0644 %SOURCE921 $RPM_BUILD_ROOT/etc/pam.d/kcheckpass
+%else
+install -D -m 0644 %SOURCE914 $RPM_BUILD_ROOT/etc/pam.d/xdm-np
+install -D -m 0644 %SOURCE9921 $RPM_BUILD_ROOT/etc/pam.d/kcheckpass
+%endif
+%endif
+install -m 0644 %SOURCE22 $RPM_BUILD_ROOT/opt/kde3/share/services/searchproviders/
+install -m 0644 %SOURCE23 $RPM_BUILD_ROOT/opt/kde3/share/services/searchproviders/
+%if %suse_version < 1011
+mkdir -p $RPM_BUILD_ROOT/usr/X11R6/bin
+%endif
+mkdir -p ${RPM_BUILD_ROOT}/usr/bin \
+ ${RPM_BUILD_ROOT}/usr/sbin \
+ ${RPM_BUILD_ROOT}/var/run/xdmctl
+%if %suse_version > 1010
+ ln -fs /opt/kde3/bin/startkde $RPM_BUILD_ROOT/usr/bin/kde
+ ln -fs /opt/kde3/bin/startkde $RPM_BUILD_ROOT/usr/bin/startkde3
+%else
+ ln -fs /opt/kde3/bin/startkde $RPM_BUILD_ROOT/usr/X11R6/bin/kde
+%endif
+ln -sf rcxdm ${RPM_BUILD_ROOT}/usr/sbin/rckdm
+#%if %suse_version > 1020
+#rm ${RPM_BUILD_ROOT}/opt/kde3/bin/ksysguardd
+#rm ${RPM_BUILD_ROOT}/etc/ksysguarddrc
+#%else
+mv ${RPM_BUILD_ROOT}/opt/kde3/bin/ksysguardd ${RPM_BUILD_ROOT}/usr/bin/ksysguardd
+ln -sf /usr/bin/ksysguardd ${RPM_BUILD_ROOT}/opt/kde3/bin/ksysguardd
+#%endif
+install -d ${RPM_BUILD_ROOT}/opt/kde3/env
+%if %suse_version < 1001
+install -m 0755 %SOURCE3 ${RPM_BUILD_ROOT}/opt/kde3/env
+%endif
+install -D -m 0755 %SOURCE16 ${RPM_BUILD_ROOT}/opt/kde3/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}/opt/kde3/share/apps/kdewizard/pics/wizard_small.png
+#%if %suse_version < 1031
+install -m 0744 %SOURCE6 $RPM_BUILD_ROOT/etc/init.d/ksysguardd
+#%endif
+mkdir -p $RPM_BUILD_ROOT/opt/kde3/share/apps/kdm/faces/
+ln -s ../pics/users/root1.png $RPM_BUILD_ROOT/opt/kde3/share/apps/kdm/faces/root.face.icon
+ln -s ../pics/users/default2.png $RPM_BUILD_ROOT/opt/kde3/share/apps/kdm/faces/.default.face.icon
+#%if %suse_version < 1031
+ln -sf /etc/init.d/ksysguardd $RPM_BUILD_ROOT/usr/sbin/rcksysguardd
+install -D -m 644 %SOURCE15 $RPM_BUILD_ROOT/etc/slp.reg.d/ksysguardd.reg
+#%endif
+# even if we use smbro
+install -D -m 644 kioslave/smb/smb-network.desktop $RPM_BUILD_ROOT/opt/kde3/share/apps/konqueror/dirtree/remote/smb-network.desktop
+#
+# install kde session file
+#
+install -m 0755 -d $RPM_BUILD_ROOT/usr/share/xsessions/
+mv $RPM_BUILD_ROOT/opt/kde3/share/apps/kdm/sessions/kde.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/opt/kde3/share/apps/kdm/sessions/$wm.desktop
+done
+%suse_update_desktop_file $RPM_BUILD_ROOT/usr/share/xsessions/kde.desktop
+#
+# delete unwanted/double files
+#
+rm $RPM_BUILD_ROOT/opt/kde3/share/apps/kdesktop/DesktopLinks/Home.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/apps/kdesktop/DesktopLinks/System.desktop
+rm $RPM_BUILD_ROOT/opt/kde3/share/icons/*/*/apps/kvirc.*
+mkdir -p $RPM_BUILD_ROOT/usr/share
+mv $RPM_BUILD_ROOT/opt/kde3/share/wallpapers $RPM_BUILD_ROOT/usr/share
+cd ../fileshareset2/src
+rm -f $RPM_BUILD_ROOT/opt/kde3/bin/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-kdebase3
+mkdir -p $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/{16x16,22x22,32x32,48x48,64x64,128x128}/apps/
+for i in {16,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/mimetypes/misc.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmcomponentchooser.png;done
+for i in {16,22,32,48,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/launch.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmperformance.png;done
+cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/16x16/actions/services.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/16x16/apps/kcmkded.png
+for i in {16,22,32,48}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/exit.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmsmserver.png;done
+for i in {16,22,32}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/spellcheck.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmspellchecking.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/filesystems/desktop.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmdesktopbehavior.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/filesystems/desktop.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmdesktop.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/apps/kmenu.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmtaskbar.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/mimetypes/colorscm.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmcolors.png;done
+for i in {16,22,32,48,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/launch.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmlaunch.png;done
+for i in {16,22,32}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/filter.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmkhtml_filter.png;done
+for i in {16,22,32}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/run.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmcgi.png;done
+for i in {16,22}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/history.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmhistory.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/filesystems/network.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmnetpref.png;done
+for i in {16,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/devices/blockdevice.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmkdnssd.png;done
+for i in {16,22,32,48,64}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/devices/joystick.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmjoystick.png;done
+for i in {16,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/devices/mouse.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmmouse.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/devices/system.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmmedia.png;done
+for i in {16,22,32}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/actions/encrypted.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmcrypto.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/filesystems/trashcan_empty.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmprivacy.png;done
+for i in {16,22,32,48,64,128}; do cp $BUILD_ROOT/opt/kde3/share/icons/crystalsvg/"$i"x"$i"/filesystems/network.png $RPM_BUILD_ROOT/opt/kde3/share/icons/hicolor/"$i"x"$i"/apps/kcmnic.png;done
+#
+# solve file conflicts with theme packages ...
+#
+mv $RPM_BUILD_ROOT/opt/kde3/share/apps/ksplash/pics $RPM_BUILD_ROOT/opt/kde3/share/apps/ksplash/pics-default
+ln -s pics-default $RPM_BUILD_ROOT/opt/kde3/share/apps/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/opt/kde3/share/apps/remoteview/smb-network.desktop
+for i in $RPM_BUILD_ROOT/opt/kde3/share/applnk/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/opt/kde3/share/applnk/apps
+ln -sf /opt/kde3/share/applnk/System/ScreenSavers $RPM_BUILD_ROOT/opt/kde3/share/applnk/apps/ScreenSavers
+
+for i in $RPM_BUILD_ROOT/opt/kde3/share/applications/kde/*.desktop \
+ $RPM_BUILD_ROOT/opt/kde3/share/apps/konqueror/servicemenus/*.desktop \
+ $RPM_BUILD_ROOT/opt/kde3/share/apps/kicker/*/*.desktop \
+ $RPM_BUILD_ROOT/opt/kde3/share/apps/kicker/*/*/*.desktop \
+ $RPM_BUILD_ROOT/opt/kde3/share/apps/kicker/*/*/*.desktop \
+ $RPM_BUILD_ROOT/usr/share/wallpapers/*.desktop \
+ $RPM_BUILD_ROOT/opt/kde3/share/apps/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/opt/kde3/share/config/kdm/README
+rm -f $RPM_BUILD_ROOT/opt/kde3/share/apps/kdm/sessions/icewm.desktop
+#
+# gimp 2.0 does have a different named icon
+#
+for i in $RPM_BUILD_ROOT//opt/kde3/share/icons/*/*/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.*
+kde_post_install
+%if %suse_version > 1020
+%fdupes $RPM_BUILD_ROOT/opt/kde3/share
+%endif
+# move konqueror.desktop back to old position (#281572)
+mv $RPM_BUILD_ROOT/opt/kde3/share/applications/kde/konqueror.desktop $RPM_BUILD_ROOT/opt/kde3/share/applnk/konqueror.desktop
+
+%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/kde3/share/apps/ksplash/pics -a ! -L opt/kde3/share/apps/ksplash/pics ;
+ then
+ if test -e opt/kde3/share/apps/ksplash/pics-default; then
+ rm -rf opt/kde3/share/apps/ksplash/pics
+ else
+ mv opt/kde3/share/apps/ksplash/pics opt/kde3/share/apps/ksplash/pics-default
+ fi
+fi
+kdmrc=/opt/kde3/share/config/kdm/kdmrc
+# if the /opt/kde3 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/kde3/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-kdebase3}
+/opt/kde3/bin/genkdmconf
+if test -f /etc/sysconfig/displaymanager ; then
+ . /etc/sysconfig/displaymanager
+fi
+%{fillup_only -n displaymanager -s kdebase3-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
+%if %suse_version < 1031
+
+%post ksysguardd
+%{fillup_and_insserv -sn kdebase3-ksysguardd ksysguardd RUN_KSYSGUARDD}
+%verifyscript
+%verify_permissions -e /opt/kde3/bin/kcheckpass
+%verify_permissions -e /opt/kde3/bin/kdesud
+%verify_permissions -e /opt/kde3/bin/khc_indexbuilder
+
+%postun ksysguardd
+%restart_on_update ksysguardd
+%insserv_cleanup
+
+%preun ksysguardd
+%stop_on_removal ksysguardd
+%endif
+
+%post runtime -p /sbin/ldconfig
+
+%postun runtime -p /sbin/ldconfig
+
+%post workspace -p /sbin/ldconfig
+%if %suse_version > 1110 && 0%{?with_hal} > 0
+chkconfig haldaemon on
+%endif
+
+%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
+/opt/kde3/share/fonts/console8x16.pcf.gz
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS COPYING README README.pam ../lame.spec ../README.mp3
+%exclude /opt/kde3/share/fonts/console8x16.pcf.gz
+%dir /opt/kde3/share/icons/hicolor/*
+%dir /opt/kde3/%_lib/kconf_update_bin
+%dir /opt/kde3/share/apps/plugin
+%dir /opt/kde3/share/applnk/
+%dir /opt/kde3/share/applnk/Settings
+%dir /opt/kde3/share/applnk/Settings/WebBrowsing
+%dir /opt/kde3/share/applnk/System/ScreenSavers
+%dir /opt/kde3/share/applnk/apps
+/opt/kde3/share/applnk/apps/ScreenSavers
+/etc/xdg/menus/*.menu
+/etc/xdg/menus/applications-merged
+%verify(not mode) %attr(2755,root,nogroup) /opt/kde3/bin/kdesud
+%verify(not mode) %attr(0755,root,man) /opt/kde3/bin/khc_indexbuilder
+/opt/kde3/env
+/opt/kde3/bin/arts-start
+/opt/kde3/bin/drkonqi
+/opt/kde3/bin/kaccess
+/opt/kde3/bin/kblankscrn.kss
+/opt/kde3/bin/kbookmarkmerger
+/opt/kde3/bin/kcminit
+/opt/kde3/bin/kcminit_startup
+/opt/kde3/%_lib/kde3/kcminit_startup.*
+/opt/kde3/bin/kcontrol*
+/opt/kde3/bin/kdeinstallktheme
+/opt/kde3/bin/kdepasswd
+/opt/kde3/bin/kdcop
+/opt/kde3/bin/kdebugdialog
+/opt/kde3/bin/kdeeject
+/opt/kde3/bin/kdeprintfax
+/opt/kde3/bin/keditfiletype
+/opt/kde3/bin/khelpcenter
+/opt/kde3/bin/kjobviewer
+/opt/kde3/bin/kcheckrunning
+/opt/kde3/bin/kpm
+/opt/kde3/bin/krandom.kss
+/opt/kde3/bin/krdb
+/opt/kde3/bin/kxkb
+/opt/kde3/bin/kdialog
+/opt/kde3/bin/klocaldomainurifilterhelper
+/opt/kde3/bin/kio_media_mounthelper
+/opt/kde3/bin/knetattach
+/opt/kde3/bin/ktrash
+/opt/kde3/bin/khc_docbookdig.pl
+/opt/kde3/bin/khc_mansearch.pl
+/opt/kde3/bin/khc_htdig.pl
+/opt/kde3/bin/khc_htsearch.pl
+/opt/kde3/bin/kapplymousetheme
+/opt/kde3/bin/kio_system_documenthelper
+%if %suse_version > 1010
+/opt/kde3/bin/runupdater
+%endif
+/opt/kde3/bin/kstart
+/opt/kde3/bin/ksystraycmd
+/opt/kde3/%_lib/kde3/cursorthumbnail.*
+/opt/kde3/%_lib/kde3/htmlthumbnail.*
+/opt/kde3/%_lib/kde3/imagethumbnail.*
+/opt/kde3/%_lib/kde3/kcm_a*
+/opt/kde3/%_lib/kde3/kcm_bell*
+/opt/kde3/%_lib/kde3/kcm_keyboard*
+/opt/kde3/%_lib/kde3/kcm_c*
+/opt/kde3/%_lib/kde3/kcm_d*
+/opt/kde3/%_lib/kde3/kcm_e*
+/opt/kde3/%_lib/kde3/kcm_f*
+/opt/kde3/%_lib/kde3/kcm_h*
+/opt/kde3/%_lib/kde3/kcm_i*
+/opt/kde3/%_lib/kde3/kcm_l*
+/opt/kde3/%_lib/kde3/kcm_nic.*
+/opt/kde3/%_lib/kde3/kcm_p*
+/opt/kde3/%_lib/kde3/kcm_smserver.*
+/opt/kde3/%_lib/kde3/kcm_spellchecking.*
+/opt/kde3/%_lib/kde3/kcm_style.*
+/opt/kde3/%_lib/kde3/kcm_usb.*
+/opt/kde3/%_lib/kde3/khelpcenter.*
+/opt/kde3/%_lib/kde3/kcm_xinerama.*
+/opt/kde3/%_lib/kde3/kxkb.*
+/opt/kde3/%_lib/kde3/djvuthumbnail.*
+/opt/kde3/%_lib/kde3/kaccess.*
+/opt/kde3/%_lib/kde3/kcminit.*
+/opt/kde3/%_lib/kde3/kcm_nsplugins.*
+/opt/kde3/%_lib/kde3/kcontrol.*
+/opt/kde3/%_lib/kde3/keditbookmarks.*
+/opt/kde3/%_lib/kde3/kfmclient.*
+/opt/kde3/%_lib/kde3/kjobviewer.*
+/opt/kde3/%_lib/kde3/kprinter.*
+/opt/kde3/%_lib/kde3/libkdeprint_part.*
+/opt/kde3/%_lib/kde3/libkshorturifilter.*
+/opt/kde3/%_lib/kde3/libkuri*
+/opt/kde3/%_lib/kde3/libkonsolepart.*
+/opt/kde3/%_lib/kde3/textthumbnail.*
+/opt/kde3/%_lib/kde3/kcm_joystick.*
+/opt/kde3/%_lib/kde3/kcm_useraccount.*
+/opt/kde3/%_lib/kde3/kcontroledit.*
+/opt/kde3/%_lib/kde3/kded_kwrited.*
+/opt/kde3/%_lib/kde3/kstyle_keramik_config.*
+/opt/kde3/%_lib/kde3/libkmanpart.*
+/opt/kde3/%_lib/kde3/liblocaldomainurifilter.*
+%if %suse_version > 1010
+/opt/kde3/%_lib/kde3/runupdater.*
+/opt/kde3/%_lib/libkdeinit_runupdater.so
+%endif
+/opt/kde3/%_lib/libkdeinit_kaccess.so
+/opt/kde3/%_lib/libkdeinit_kcminit.so
+/opt/kde3/%_lib/libkdeinit_kcminit_startup.so
+/opt/kde3/%_lib/libkdeinit_kcontrol.so
+/opt/kde3/%_lib/libkdeinit_kcontroledit.so
+/opt/kde3/%_lib/libkdeinit_keditbookmarks.so
+/opt/kde3/%_lib/libkdeinit_kfmclient.so
+/opt/kde3/%_lib/libkdeinit_khelpcenter.so
+/opt/kde3/%_lib/libkdeinit_kjobviewer.so
+/opt/kde3/%_lib/libkdeinit_kxkb.so
+/opt/kde3/%_lib/kde3/libnsplugin.*
+/opt/kde3/%_lib/kde3/kded_remotedirnotify.*
+/opt/kde3/%_lib/kde3/kded_systemdirnotify.*
+/opt/kde3/%_lib/kde3/libkhtmlkttsdplugin.*
+/opt/kde3/%_lib/kde3/kcm_media.la
+/opt/kde3/%_lib/kde3/kcm_media.so
+/opt/kde3/%_lib/kde3/kded_homedirnotify.la
+/opt/kde3/%_lib/kde3/kded_homedirnotify.so
+/opt/kde3/%_lib/kde3/kded_medianotifier.la
+/opt/kde3/%_lib/kde3/kded_medianotifier.so
+%if 0%{?with_hal} > 0
+/opt/kde3/%_lib/kde3/media_propsdlgplugin.*
+%endif
+/opt/kde3/%_lib/kde3/kcm_kded.*
+/opt/kde3/%_lib/kde3/kcm_kdnssd.*
+/opt/kde3/%_lib/kde3/kcm_keyboard.*
+/opt/kde3/%_lib/kde3/kcm_keys.*
+/opt/kde3/%_lib/kde3/kcm_kio.*
+/opt/kde3/%_lib/kde3/kcm_knotify.*
+/opt/kde3/%_lib/kde3/kcm_konq.*
+/opt/kde3/%_lib/kde3/kcm_konqhtml.*
+/opt/kde3/%_lib/kde3/kcm_kthememanager.*
+/opt/kde3/%_lib/kde3/kcm_kurifilt.*
+/opt/kde3/share/applications/kde/khtml_filter.desktop
+/opt/kde3/share/applications/kde/media.desktop
+/opt/kde3/share/applications/kde/joystick.desktop
+/opt/kde3/share/applications/kde/kcm_useraccount.desktop
+/opt/kde3/share/applications/kde/kdepasswd.desktop
+/opt/kde3/share/applications/kde/kthememanager.desktop
+/opt/kde3/share/applications/kde/Help.desktop
+/opt/kde3/share/applications/kde/KControl.desktop
+/opt/kde3/share/applications/kde/arts.desktop
+/opt/kde3/share/applications/kde/bell.desktop
+/opt/kde3/share/applications/kde/cache.desktop
+/opt/kde3/share/applications/kde/colors.desktop
+/opt/kde3/share/applications/kde/componentchooser.desktop
+/opt/kde3/share/applications/kde/cookies.desktop
+/opt/kde3/share/applications/kde/crypto.desktop
+/opt/kde3/share/applications/kde/display.desktop
+/opt/kde3/share/applications/kde/dma.desktop
+/opt/kde3/share/applications/kde/ebrowsing.desktop
+/opt/kde3/share/applications/kde/filebrowser.desktop
+/opt/kde3/share/applications/kde/filetypes.desktop
+/opt/kde3/share/applications/kde/fonts.desktop
+/opt/kde3/share/applications/kde/clock.desktop
+/opt/kde3/share/applications/kde/icons.desktop
+/opt/kde3/share/applications/kde/interrupts.desktop
+/opt/kde3/share/applications/kde/installktheme.desktop
+/opt/kde3/share/applications/kde/ioports.desktop
+/opt/kde3/share/applications/kde/ioslaveinfo.desktop
+/opt/kde3/share/applications/kde/kcmaccess.desktop
+/opt/kde3/share/applications/kde/kcmcgi.desktop
+/opt/kde3/share/applications/kde/kcmcss.desktop
+/opt/kde3/share/applications/kde/kcmhistory.desktop
+/opt/kde3/share/applications/kde/kcmkded.desktop
+/opt/kde3/share/applications/kde/kcmlaunch.desktop
+/opt/kde3/share/applications/kde/kcm_kdnssd.desktop
+/opt/kde3/share/applications/kde/kcmnotify.desktop
+/opt/kde3/share/applications/kde/kcmperformance.desktop
+/opt/kde3/share/applications/kde/kcmusb.desktop
+/opt/kde3/share/applications/kde/kdeprintfax.desktop
+/opt/kde3/share/applications/kde/keyboard.desktop
+/opt/kde3/share/applications/kde/keyboard_layout.desktop
+/opt/kde3/share/applications/kde/keys.desktop
+/opt/kde3/share/applications/kde/kfmclient.desktop
+/opt/kde3/share/applications/kde/kfmclient_dir.desktop
+/opt/kde3/share/applications/kde/kfmclient_html.desktop
+/opt/kde3/share/applications/kde/kfmclient_war.desktop
+/opt/kde3/share/applications/kde/khtml_behavior.desktop
+/opt/kde3/share/applications/kde/khtml_fonts.desktop
+/opt/kde3/share/applications/kde/khtml_java_js.desktop
+/opt/kde3/share/applications/kde/khtml_plugins.desktop
+/opt/kde3/share/applications/kde/kjobviewer.desktop
+/opt/kde3/share/applications/kde/lanbrowser.desktop
+/opt/kde3/share/applications/kde/language.desktop
+/opt/kde3/share/applications/kde/memory.desktop
+/opt/kde3/share/applications/kde/mouse.desktop
+/opt/kde3/share/applications/kde/netpref.desktop
+/opt/kde3/share/applications/kde/nic.desktop
+/opt/kde3/share/applications/kde/partitions.desktop
+/opt/kde3/share/applications/kde/pci.desktop
+/opt/kde3/share/applications/kde/printers.desktop
+/opt/kde3/share/applications/kde/privacy.desktop
+/opt/kde3/share/applications/kde/processor.desktop
+/opt/kde3/share/applications/kde/proxy.desktop
+/opt/kde3/share/applications/kde/scsi.desktop
+/opt/kde3/share/applications/kde/smbstatus.desktop
+/opt/kde3/share/applications/kde/sound.desktop
+/opt/kde3/share/applications/kde/spellchecking.desktop
+/opt/kde3/share/applications/kde/style.desktop
+/opt/kde3/share/applications/kde/useragent.desktop
+/opt/kde3/share/applications/kde/xserver.desktop
+/opt/kde3/share/applications/kde/cdinfo.desktop
+/opt/kde3/share/applnk/.hidden
+/opt/kde3/share/applnk/Settings/Information
+/opt/kde3/share/applnk/Settings/LookNFeel
+/opt/kde3/share/applnk/Settings/WebBrowsing/khtml_appearance.desktop
+/opt/kde3/share/applnk/Settings/WebBrowsing/smb.desktop
+/opt/kde3/share/apps/drkonqi
+/opt/kde3/share/apps/kc*
+/opt/kde3/share/apps/kdcop
+/opt/kde3/share/apps/kdeprint*
+/opt/kde3/share/apps/kdewizard
+/opt/kde3/share/apps/kdisplay
+/opt/kde3/share/apps/khelpcenter/searchhandlers/docbook.desktop
+/opt/kde3/share/apps/khelpcenter
+/opt/kde3/share/apps/kio*
+/opt/kde3/share/apps/kjobviewer
+/opt/kde3/share/apps/konsole
+/opt/kde3/share/apps/khtml/kpartplugins
+/opt/kde3/share/apps/kthememanager
+/opt/kde3/share/apps/remoteview
+/opt/kde3/share/apps/systemview
+/opt/kde3/share/apps/kaccess
+/opt/kde3/share/config.kcfg/klaunch.kcfg
+/opt/kde3/share/config.kcfg/khelpcenter.kcfg
+/opt/kde3/share/config.kcfg/keditbookmarks.kcfg
+/opt/kde3/share/config.kcfg/launcherapplet.kcfg
+/opt/kde3/share/config.kcfg/mediamanagersettings.kcfg
+/opt/kde3/share/mimelnk/inode/system_directory.desktop
+/opt/kde3/share/services/kded/remotedirnotify.desktop
+/opt/kde3/share/services/kded/systemdirnotify.desktop
+%if 0%{?with_hal} > 0
+/opt/kde3/share/services/media_propsdlgplugin.desktop
+
+%endif
+%config(noreplace) /opt/kde3/share/config/kshorturifilterrc
+%config(noreplace) /opt/kde3/share/config/kxkb_groups
+/opt/kde3/share/desktop-directories
+%exclude /opt/kde3/share/doc/HTML/en/kioslave
+%dir /opt/kde3/share/fonts
+%dir /opt/kde3/share/fonts/override
+%verify(not md5 size mtime) /opt/kde3/share/fonts/override/fonts.dir
+%dir /opt/kde3/share/icons/*/*/*
+/opt/kde3/share/config.kcfg/kcm_useraccount.kcfg
+/opt/kde3/share/config.kcfg/kcm_useraccount_pass.kcfg
+%exclude /opt/kde3/share/icons/*/*/*/style.*
+%exclude /opt/kde3/share/icons/*/*/*/looknfeel.*
+%exclude /opt/kde3/share/icons/*/*/*/energy.*
+%exclude /opt/kde3/share/icons/*/*/*/date.*
+%exclude /opt/kde3/share/icons/*/*/*/filetypes.*
+%exclude /opt/kde3/share/icons/*/*/*/personal.*
+/opt/kde3/share/icons/*/*/*/a*.*
+/opt/kde3/share/icons/*/*/*/b*.*
+/opt/kde3/share/icons/*/*/*/c*.*
+/opt/kde3/share/icons/*/*/*/d*.*
+/opt/kde3/share/icons/*/*/*/f*.*
+/opt/kde3/share/icons/*/*/*/g*.*
+/opt/kde3/share/icons/*/*/*/help_index.*
+/opt/kde3/share/icons/*/*/*/icons.*
+/opt/kde3/share/icons/*/*/*/input_devices_settings.*
+/opt/kde3/share/icons/*/*/*/kcmx.*
+/opt/kde3/share/icons/*/*/*/kcmdf.*
+/opt/kde3/share/icons/*/*/*/kbinaryclock.*
+/opt/kde3/share/icons/*/*/apps/kcmcgi.*
+/opt/kde3/share/icons/*/*/apps/kcmcolors.*
+/opt/kde3/share/icons/*/*/apps/kcmcomponentchooser.*
+/opt/kde3/share/icons/*/*/apps/kcmcrypto.*
+/opt/kde3/share/icons/*/*/apps/kcmhistory.*
+/opt/kde3/share/icons/*/*/apps/kcmjoystick.*
+/opt/kde3/share/icons/*/*/apps/kcmkded.*
+/opt/kde3/share/icons/*/*/apps/kcmkdnssd.*
+/opt/kde3/share/icons/*/*/apps/kcmkhtml_filter.*
+/opt/kde3/share/icons/*/*/apps/kcmlaunch.*
+/opt/kde3/share/icons/*/*/apps/kcmmedia.*
+/opt/kde3/share/icons/*/*/apps/kcmmouse.*
+/opt/kde3/share/icons/*/*/apps/kcmnetpref.*
+/opt/kde3/share/icons/*/*/apps/kcmnic.*
+/opt/kde3/share/icons/*/*/apps/kcmperformance.*
+/opt/kde3/share/icons/*/*/apps/kcmprivacy.*
+/opt/kde3/share/icons/*/*/apps/kcmspellchecking.*
+/opt/kde3/share/icons/*/*/*/ieee1394.*
+/opt/kde3/share/icons/*/*/*/kdeprintfax.*
+/opt/kde3/share/icons/*/*/*/kdisknav.*
+/opt/kde3/share/icons/*/*/*/knetattach.*
+/opt/kde3/share/icons/*/*/*/key_bindings.*
+/opt/kde3/share/icons/*/*/*/keyboard_layout.*
+/opt/kde3/share/icons/*/*/*/kfm_home.*
+/opt/kde3/share/icons/*/*/*/khelpcenter.*
+/opt/kde3/share/icons/*/*/*/kjobviewer.*
+/opt/kde3/share/icons/*/*/*/konsole.*
+/opt/kde3/share/icons/*/*/*/l*.*
+/opt/kde3/share/icons/*/*/*/m*.*
+/opt/kde3/share/icons/*/*/*/ne*.*
+/opt/kde3/share/icons/*/*/*/opera.*
+/opt/kde3/share/icons/*/*/*/r*.*
+/opt/kde3/share/icons/*/*/*/s*.*
+/opt/kde3/share/icons/*/*/*/usb.*
+/opt/kde3/share/icons/*/*/*/vnc.*
+/opt/kde3/share/icons/*/*/*/w*.*
+/opt/kde3/share/icons/*/*/*/e*.*
+/opt/kde3/share/icons/*/*/*/kcmdevices.*
+/opt/kde3/share/icons/*/*/*/kcmdrkonqi.*
+/opt/kde3/share/icons/*/*/*/kcmmemory.*
+/opt/kde3/share/icons/*/*/*/kcmmidi.*
+/opt/kde3/share/icons/*/*/*/kcmpartitions.*
+/opt/kde3/share/icons/*/*/*/kcmpci.*
+/opt/kde3/share/icons/*/*/*/kcmprocessor.*
+/opt/kde3/share/icons/*/*/*/kcmscsi.*
+/opt/kde3/share/icons/*/*/*/kthememgr.*
+/opt/kde3/share/icons/*/*/*/kcontrol.*
+/opt/kde3/share/icons/*/*/*/kxkb.*
+/opt/kde3/share/icons/*/*/*/p*.*
+/opt/kde3/share/icons/*/*/*/t*.*
+/opt/kde3/share/icons/*/*/*/qtella.*
+/opt/kde3/share/icons/*/*/*/x*.*
+# these have no PNG
+/opt/kde3/share/icons/*/scalable/apps/hardware.svgz
+/opt/kde3/share/icons/*/scalable/apps/kate2.svgz
+/opt/kde3/share/icons/*/scalable/apps/kwrite2.svgz
+/opt/kde3/share/icons/*/scalable/apps/openoffice.svgz
+/opt/kde3/share/icons/*/scalable/apps/quicktime.svgz
+/opt/kde3/share/locale
+/opt/kde3/share/mimelnk/application/x-konsole.desktop
+/opt/kde3/share/mimelnk/application/x-ktheme.desktop
+/opt/kde3/share/mimelnk/application/x-smb-server.desktop
+/opt/kde3/share/mimelnk/print
+/opt/kde3/share/services/textthumbnail.desktop
+/opt/kde3/share/services/htmlthumbnail.desktop
+/opt/kde3/share/services/ka*.desktop
+/opt/kde3/share/services/kdeprint_part.desktop
+/opt/kde3/share/services/konsolepart.desktop
+/opt/kde3/share/services/konsole-script.desktop
+/opt/kde3/share/services/kshorturifilter.desktop
+/opt/kde3/share/services/ku*.desktop
+/opt/kde3/share/services/searchproviders
+/opt/kde3/share/services/useragentstrings
+/opt/kde3/share/services/imagethumbnail.desktop
+/opt/kde3/share/services/kxkb.desktop
+/opt/kde3/share/services/kmanpart.desktop
+/opt/kde3/share/services/localdomainurifilter.desktop
+/opt/kde3/share/services/kwrited.desktop
+/opt/kde3/share/services/djvuthumbnail.desktop
+/opt/kde3/share/services/kded/kwrited.desktop
+/opt/kde3/share/servicetypes/terminalemulator.desktop
+/opt/kde3/share/servicetypes/kateplugin.desktop
+/opt/kde3/share/servicetypes/findpart.desktop
+/opt/kde3/share/servicetypes/searchprovider.desktop
+/opt/kde3/share/servicetypes/thumbcreator.desktop
+/opt/kde3/share/servicetypes/uasprovider.desktop
+%exclude /opt/kde3/share/sounds/KDE_Close_Window*
+%exclude /opt/kde3/share/sounds/KDE_Dialog*
+%exclude /opt/kde3/share/sounds/KDE_Desktop*
+%exclude /opt/kde3/share/sounds/KDE_Logout*
+%exclude /opt/kde3/share/sounds/KDE_Startup*
+%exclude /opt/kde3/share/sounds/KDE_Window*
+/opt/kde3/share/sounds
+/opt/kde3/share/templates
+/opt/kde3/share/services/khelpcenter.desktop
+/opt/kde3/bin/keditbookmarks
+/opt/kde3/bin/kfm*
+/opt/kde3/share/apps/kbookmark
+/opt/kde3/share/apps/keditbookmarks
+/opt/kde3/share/icons/*/*/*/keditbookmarks.*
+/opt/kde3/share/icons/*/*/*/kfm.*
+/opt/kde3/share/icons/*/*/*/konqueror.*
+/opt/kde3/share/services/konq*
+/opt/kde3/share/servicetypes/konq*
+/opt/kde3/share/services/cursorthumbnail.desktop
+/opt/kde3/%_lib/kde3/kcm_randr.*
+/opt/kde3/bin/krandrtray
+/opt/kde3/share/applications/kde/krandrtray.desktop
+/opt/kde3/%_lib/kde3/kded_mediamanager.*
+/opt/kde3/%_lib/kde3/kfile_media.*
+/opt/kde3/%_lib/kde3/kfile_trash.*
+/opt/kde3/share/applications/kde/devices.desktop
+/opt/kde3/share/applications/kde/knetattach.desktop
+/opt/kde3/share/applications/kde/opengl.desktop
+/opt/kde3/share/icons/*/*/*/kcmopengl.*
+/opt/kde3/share/mimelnk/media
+/opt/kde3/share/services/kded/mediamanager.desktop
+/opt/kde3/share/services/kded/homedirnotify.desktop
+/opt/kde3/share/services/kded/medianotifier.desktop
+/opt/kde3/share/services/kfile_media.desktop
+/opt/kde3/share/services/kfile_trash.desktop
+/opt/kde3/share/services/kfile_trash_system.desktop
+/opt/kde3/share/mimelnk/fonts/package.desktop
+/opt/kde3/%_lib/kde3/exrthumbnail.*
+/opt/kde3/share/services/exrthumbnail.desktop
+%dir /opt/kde3/share/mimelnk/fonts
+/opt/kde3/bin/kfontinst
+/opt/kde3/%_lib/kde3/fontthumbnail.*
+/opt/kde3/%_lib/kde3/kfile_font.*
+/opt/kde3/%_lib/kde3/libkfontviewpart.*
+%dir /opt/kde3/share/apps/kfontview
+/opt/kde3/share/apps/kfontview/kfontviewpart.rc
+/opt/kde3/share/applications/kde/kcmfontinst.desktop
+/opt/kde3/share/mimelnk/fonts/folder.desktop
+/opt/kde3/share/mimelnk/fonts/system-folder.desktop
+/opt/kde3/share/services/fontthumbnail.desktop
+/opt/kde3/share/services/kfile_font.desktop
+/opt/kde3/share/services/kfontviewpart.desktop
+%_mandir/man1/*
+%if %suse_version < 1001
+%config(noreplace) /etc/security/fileshare.conf
+/opt/kde3/bin/filesharelist
+%verify(not mode) /opt/kde3/bin/fileshareset
+%endif
+%{_mandir}/man8/kcheckpass.8.gz
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kcontrol
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kdcop
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kdebugdialog
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kdeprint
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kdesu
+%exclude /opt/kde3/share/doc/HTML/en/khelpcenter/userguide
+%exclude /opt/kde3/share/doc/HTML/en/khelpcenter/visualdict
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/khelpcenter
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/knetattach
+/opt/kde3/share/applications/kde/desktoppath.desktop
+
+%files samba
+%defattr(-,root,root)
+/opt/kde3/%_lib/kde3/kcm_samba.*
+/opt/kde3/%_lib/kde3/kio_smb.*
+/opt/kde3/share/services/smb.protocol
+%dir /opt/kde3/share/apps/konqueror/dirtree
+%dir /opt/kde3/share/apps/konqueror/dirtree/remote
+/opt/kde3/share/apps/konqueror/dirtree/remote/smb-network.desktop
+/opt/kde3/share/mimelnk/application/x-smb-workgroup.desktop
+
+%files kdm
+%defattr(-,root,root)
+%dir /opt/kde3/share/doc/kdm
+/opt/kde3/bin/genkdmconf
+/opt/kde3/bin/kdm*
+/opt/kde3/bin/krootimage
+/opt/kde3/share/apps/kdm
+/opt/kde3/%_lib/kde3/kgreet_pam.*
+%doc /opt/kde3/share/doc/kdm/README
+%if %suse_version < 1020
+%config /etc/pam.d/xdm-np
+%endif
+%dir /opt/kde3/share/config/kdm
+%config(noreplace) /opt/kde3/share/config/kdm/kdmrc
+%config(noreplace) /opt/kde3/share/config/kdm/backgroundrc
+%if %suse_version < 1010
+%config /opt/kde3/share/config/kdm/Xaccess
+%config /opt/kde3/share/config/kdm/Xreset
+%config /opt/kde3/share/config/kdm/Xresources
+%config /opt/kde3/share/config/kdm/Xsession
+%config /opt/kde3/share/config/kdm/Xsetup
+%config /opt/kde3/share/config/kdm/Xstartup
+%config /opt/kde3/share/config/kdm/Xwilling
+%endif
+%ghost /var/run/xdmctl
+/usr/sbin/rckdm
+/opt/kde3/share/applications/kde/kdm.desktop
+/opt/kde3/share/icons/*/*/*/kdmconfig.*
+/opt/kde3/%_lib/kde3/kcm_kdm.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kdm
+
+%files session
+%defattr(-,root,root)
+%if %suse_version > 1010
+/usr/bin/kde
+/usr/bin/startkde3
+%else
+/usr/X11R6/bin/kde
+%endif
+%if %suse_version < 1030
+%dir /usr/share/xsessions
+%endif
+/usr/share/xsessions/kde.desktop
+
+%files extra
+%defattr(-,root,root)
+/opt/kde3/bin/kpersonalizer
+/opt/kde3/share/applications/kde/kpersonalizer.desktop
+/opt/kde3/share/apps/kpersonalizer
+/opt/kde3/share/icons/*/*/*/kpersonalizer.*
+/opt/kde3/bin/kfontview
+/opt/kde3/share/applications/kde/kfontview.desktop
+/opt/kde3/share/apps/kfontview/kfontviewui.rc
+/opt/kde3/%_lib/kde3/khotkeys_arts.*
+
+%files nsplugin
+%defattr(-,root,root)
+/opt/kde3/bin/nsplugin*
+/opt/kde3/share/apps/plugin/nspluginpart.rc
+%dir /opt/kde3/share/applnk/Settings/WebBrowsing
+/opt/kde3/share/applnk/Settings/WebBrowsing/nsplugin.desktop
+
+%files devel
+%defattr(-,root,root)
+/opt/kde3/include/*
+/opt/kde3/%_lib/libkonq.so
+/opt/kde3/%_lib/libkdecorations.so
+/opt/kde3/%_lib/libkonqsidebarplugin.so
+/opt/kde3/%_lib/libkickermain.so
+/opt/kde3/%_lib/libtask*.so
+/opt/kde3/%_lib/libksgrd.so
+%if %suse_version > 1010
+/opt/kde3/%_lib/libkickoffsearch_interfaces.so
+/opt/kde3/%_lib/libkickoffsearch_interfaces.la
+%endif
+/opt/kde3/%_lib/libksplashthemes.so
+/opt/kde3/%_lib/libkateinterfaces.so
+/opt/kde3/%_lib/libkateutils.so
+/opt/kde3/%_lib/libkhotkeys_shared.so
+/opt/kde3/%_lib/libkateinterfaces.la
+/opt/kde3/%_lib/libkateutils.la
+/opt/kde3/%_lib/libkdecorations.la
+/opt/kde3/%_lib/libkfontinst.la
+/opt/kde3/%_lib/libkfontinst.so
+/opt/kde3/%_lib/libkhotkeys_shared.la
+/opt/kde3/%_lib/libkickermain.la
+/opt/kde3/%_lib/libkonq.la
+/opt/kde3/%_lib/libkonqsidebarplugin.la
+/opt/kde3/%_lib/libksgrd.la
+/opt/kde3/%_lib/libksplashthemes.la
+/opt/kde3/%_lib/libtaskbar.la
+/opt/kde3/%_lib/libtaskmanager.la
+/opt/kde3/%_lib/libkasbar.so
+/opt/kde3/%_lib/libkasbar.la
+
+%files ksysguardd
+%defattr(-,root,root)
+%dir /etc/slp.reg.d
+#%if %suse_version < 1020
+/usr/bin/ksysguardd
+/opt/kde3/bin/ksysguardd
+%config(noreplace) /etc/ksysguarddrc
+#%endif
+#%if %suse_version > 1030
+#/usr/bin/ksysguardd
+#%config(noreplace) /etc/ksysguarddrc
+#%endif
+/etc/init.d/ksysguardd
+/usr/sbin/rcksysguardd
+%config(noreplace) /etc/slp.reg.d/*
+
+%if %suse_version > 1010
+%if %suse_version < 1140
+
+%files beagle
+%defattr(-,root,root)
+/opt/kde3/bin/khc_beagle_search.pl
+/opt/kde3/bin/khc_beagle_index.pl
+/opt/kde3/share/apps/khelpcenter/searchhandlers/docbook.desktop
+/opt/kde3/%_lib/kde3/kickoffsearch_beagle.*
+/opt/kde3/share/services/kickoffsearch_beagle.desktop
+%endif
+%endif
+
+%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)
+/opt/kde3/bin/konsole*
+/opt/kde3/%_lib/kde3/konsole.*
+/opt/kde3/%_lib/kde3/kcm_konsole.*
+/opt/kde3/%_lib/libkdeinit_konsole.so
+/opt/kde3/share/applications/kde/konsole.desktop
+/opt/kde3/share/applications/kde/konsolesu.desktop
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/konsole
+/opt/kde3/share/applications/kde/Home.desktop
+/opt/kde3/%_lib/libkdeinit_konqueror.so
+/opt/kde3/share/apps/konqueror/konq-simplebrowser.rc
+/opt/kde3/share/applications/kde/konquerorsu.desktop
+/opt/kde3/share/applnk/konqueror.desktop
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/konqueror
+/opt/kde3/share/config.kcfg/konqueror.kcfg
+/opt/kde3/bin/konqueror
+/opt/kde3/%_lib/kde3/konq*.so
+/opt/kde3/%_lib/kde3/konq*.la
+%dir /opt/kde3/share/apps/konqueror
+/opt/kde3/share/apps/konqueror/tiles
+/opt/kde3/share/apps/konqueror/about
+/opt/kde3/share/apps/konqueror/icons
+/opt/kde3/share/apps/konqueror/konqueror.rc
+/opt/kde3/share/apps/konqueror/p*
+/opt/kde3/share/apps/konqueror/servicemenus
+/opt/kde3/%_lib/kde3/konqueror.*
+/opt/kde3/share/apps/konqiconview
+/opt/kde3/share/apps/konqlistview
+/opt/kde3/share/apps/konqsidebartng
+/opt/kde3/%_lib/kde3/kded_konqy_preloader.*
+/opt/kde3/share/services/kded/konqy_preloader.desktop
+/opt/kde3/share/applications/kde/konqbrowser.desktop
+/opt/kde3/share/applications/kde/konqfilemgr.desktop
+/opt/kde3/share/config.kcfg/konq_listview.kcfg
+%config(noreplace) /opt/kde3/share/config/konqsidebartng.rc
+/opt/kde3/bin/kfind
+/opt/kde3/%_lib/kde3/libkfindpart.*
+/opt/kde3/share/applications/kde/Kfind.desktop
+/opt/kde3/share/apps/kfindpart
+/opt/kde3/share/icons/*/*/*/kfind.*
+/opt/kde3/share/services/kfindpart.desktop
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kfind
+/opt/kde3/bin/kwrite
+/opt/kde3/%_lib/kde3/kwrite.*
+/opt/kde3/%_lib/libkdeinit_kwrite.so
+/opt/kde3/share/applications/kde/kwrite.desktop
+/opt/kde3/share/apps/kwrite
+/opt/kde3/share/icons/*/*/*/kwrite.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kwrite
+/opt/kde3/bin/kate
+/opt/kde3/%_lib/kde3/kate.*
+/opt/kde3/%_lib/libkateinterfaces.so.*
+/opt/kde3/%_lib/libkateutils.so.*
+/opt/kde3/%_lib/libkdeinit_kate.so
+/opt/kde3/share/applications/kde/kate.desktop
+/opt/kde3/share/apps/kate
+/opt/kde3/share/config/katerc
+/opt/kde3/share/icons/*/*/*/kate.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kate
+
+%files workspace
+%defattr(-,root,root)
+%exclude /usr/share/wallpapers/default_blue.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kicker
+/usr/share/wallpapers
+/opt/kde3/bin/startkde
+/opt/kde3/bin/kdesktop
+/opt/kde3/bin/kdesktop_lock
+/opt/kde3/bin/ksmserver
+/opt/kde3/%_lib/libkdeinit_ksmserver.so
+/opt/kde3/bin/ksplash
+/opt/kde3/bin/ksplashsimple
+/opt/kde3/%_lib/kde3/kdesktop.*
+/opt/kde3/share/apps/kdesktop
+/opt/kde3/share/config.kcfg/kdesktop.kcfg
+%config(noreplace) /opt/kde3/share/config/kdesktop_custom_menu*
+/opt/kde3/bin/kicker
+/opt/kde3/%_lib/kde3/kicker*
+/opt/kde3/%_lib/kde3/kcm_kicker*
+/opt/kde3/%_lib/libkickermain.so.*
+/opt/kde3/share/applications/kde/kcmkicker.desktop
+/opt/kde3/share/apps/kicker
+/opt/kde3/share/config.kcfg/kickerSettings.kcfg
+/opt/kde3/share/icons/*/*/*/kcmkicker.*
+/opt/kde3/share/icons/*/*/*/kicker.*
+/opt/kde3/%_lib/kconf_update_bin/kicker-3.4-reverseLayout
+/opt/kde3/bin/kwin
+/opt/kde3/bin/kwin_killer_helper
+/opt/kde3/bin/kwin_rules_dialog
+/opt/kde3/%_lib/kde3/kwin_*
+/opt/kde3/share/apps/kwin
+/opt/kde3/%_lib/kde3/kwin.*
+/opt/kde3/%_lib/kde3/kwin3_*
+/opt/kde3/%_lib/kconf_update_bin/kwin_update_default_rules
+/opt/kde3/%_lib/kconf_update_bin/kwin_update_window_settings
+/opt/kde3/share/applications/kde/kwinrules.desktop
+/opt/kde3/share/applications/kde/kwindecoration.desktop
+/opt/kde3/share/applications/kde/kwinoptions.desktop
+/opt/kde3/share/config.kcfg/kwin.kcfg
+/opt/kde3/share/icons/*/*/*/kwin.*
+/var/adm/fillup-templates/sysconfig.windowmanager-kdebase3
+/opt/kde3/share/apps/ksplash
+/opt/kde3/share/services/ksplash.desktop
+/opt/kde3/share/services/ksplashdefault.desktop
+/opt/kde3/share/services/ksplashredmond.desktop
+/opt/kde3/share/services/ksplashstandard.desktop
+/opt/kde3/share/servicetypes/ksplashplugins.desktop
+/opt/kde3/share/icons/*/*/*/ksplash.*
+/opt/kde3/%_lib/kde3/ksplash*
+/opt/kde3/%_lib/libksplashthemes.so.*
+/opt/kde3/share/icons/*/*/apps/kcmsmserver.*
+/opt/kde3/share/applications/kde/kcmsmserver.desktop
+/opt/kde3/%_lib/kde3/ksmserver.*
+/opt/kde3/share/apps/ksmserver
+/opt/kde3/%_lib/kde3/clock_panelapplet.*
+/opt/kde3/%_lib/kde3/dockbar_panelextension.*
+/opt/kde3/%_lib/kde3/kasbar_panelextension.*
+/opt/kde3/%_lib/kde3/menu_panelapplet.*
+/opt/kde3/%_lib/kde3/klipper_panelapplet.*
+/opt/kde3/%_lib/kde3/launcher_panelapplet.*
+/opt/kde3/%_lib/kde3/lockout_panelapplet.*
+/opt/kde3/%_lib/kde3/minipager_panelapplet.*
+/opt/kde3/%_lib/kde3/naughty_panelapplet.*
+/opt/kde3/%_lib/kde3/run_panelapplet.*
+/opt/kde3/%_lib/kde3/sidebar_panelextension.*
+/opt/kde3/share/applications/kde/panel.desktop
+/opt/kde3/share/applications/kde/panel_appearance.desktop
+/opt/kde3/%_lib/kde3/media_panelapplet.*
+/opt/kde3/%_lib/kde3/kcm_taskbar.*
+/opt/kde3/share/applications/kde/kcmtaskbar.desktop
+/opt/kde3/share/config.kcfg/taskbar.kcfg
+/opt/kde3/share/icons/*/*/apps/kcmtaskbar.*
+/opt/kde3/%_lib/kde3/kcm_screensaver.*
+/opt/kde3/share/applications/kde/screensaver.desktop
+/opt/kde3/share/applnk/System/ScreenSavers/KBlankscreen.desktop
+/opt/kde3/share/applnk/System/ScreenSavers/KRandom.desktop
+/opt/kde3/bin/kwebdesktop
+/opt/kde3/share/config.kcfg/kwebdesktop.kcfg
+/opt/kde3/share/applications/kde/background.desktop
+/opt/kde3/%_lib/kde3/kcm_background*
+/opt/kde3/bin/default_desktop_aligning
+/opt/kde3/share/applications/kde/desktop.desktop
+/opt/kde3/share/applications/kde/desktopbehavior.desktop
+/opt/kde3/share/applications/kde/ksplashthememgr.desktop
+/opt/kde3/share/icons/*/*/apps/kcmdesktop.*
+/opt/kde3/share/icons/*/*/apps/kcmdesktopbehavior.*
+/opt/kde3/%_lib/kde3/kcm_ksplashthemes.*
+/opt/kde3/%_lib/kde3/kcm_kwindecoration.*
+/opt/kde3/%_lib/kde3/kcm_kwinoptions.*
+/opt/kde3/%_lib/kde3/kcm_kwinrules.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/ksplashml
+/opt/kde3/shutdown
+%if %suse_version > 1010
+/opt/kde3/%_lib/libkickoffsearch_interfaces.so.*
+/opt/kde3/share/servicetypes/kickoffsearchplugin.desktop
+%endif
+/opt/kde3/share/autostart/*
+/opt/kde3/share/apps/naughtyapplet
+/opt/kde3/%_lib/libtask*.so.*
+/opt/kde3/bin/extensionproxy
+/opt/kde3/bin/appletproxy
+/opt/kde3/%_lib/kde3/appletproxy.*
+/opt/kde3/%_lib/kde3/extensionproxy.*
+/opt/kde3/%_lib/kde3/taskbar*
+/opt/kde3/%_lib/kde3/trash_panelapplet*
+/opt/kde3/%_lib/kde3/sys*
+/opt/kde3/share/apps/clockapplet
+/opt/kde3/bin/kasbar
+/opt/kde3/%_lib/libkasbar.so.*
+/opt/kde3/%_lib/libkdeinit_kicker.so
+/opt/kde3/%_lib/libkdeinit_appletproxy.so
+/opt/kde3/%_lib/libkdeinit_extensionproxy.so
+/opt/kde3/%_lib/libkdeinit_kdesktop.so
+/opt/kde3/%_lib/libkdeinit_kwin.so
+/opt/kde3/%_lib/libkdeinit_kwin_rules_dialog.so
+/opt/kde3/bin/ktip
+/opt/kde3/share/appl*/*/ktip.desktop
+/opt/kde3/share/icons/*/*/*/ktip.*
+/opt/kde3/bin/kpager
+/opt/kde3/share/appl*/*/kpager.desktop
+/opt/kde3/share/icons/*/*/*/kpager.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kpager
+/opt/kde3/bin/klipper
+/opt/kde3/%_lib/kde3/klipper.*
+/opt/kde3/%_lib/libkdeinit_klipper.so
+/opt/kde3/share/applications/kde/klipper.desktop
+%config(noreplace) /opt/kde3/share/config/klipperrc
+/opt/kde3/share/icons/*/*/*/klipper.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/klipper
+/opt/kde3/share/applications/kde/kmenuedit.desktop
+/opt/kde3/share/apps/kmenuedit
+/opt/kde3/share/icons/*/*/*/kmenuedit.*
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kmenuedit
+/opt/kde3/bin/kmenuedit
+/opt/kde3/%_lib/kde3/kmenuedit.*
+/opt/kde3/%_lib/libkdeinit_kmenuedit.so
+/opt/kde3/bin/kinfocenter
+/opt/kde3/share/applications/kde/kinfocenter.desktop
+/opt/kde3/share/apps/kinfocenter
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kinfocenter
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/khelpcenter/userguide
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/khelpcenter/visualdict
+/opt/kde3/share/sounds/KDE_Close_Window*
+/opt/kde3/share/sounds/KDE_Dialog*
+/opt/kde3/share/sounds/KDE_Desktop*
+/opt/kde3/share/sounds/KDE_Logout*
+/opt/kde3/share/sounds/KDE_Startup*
+/opt/kde3/share/sounds/KDE_Window*
+/opt/kde3/%_lib/libkdeinit_khotkeys.so
+/opt/kde3/%_lib/kde3/kcm_khotkeys.*
+/opt/kde3/%_lib/kde3/kcm_khotkeys_init.*
+/opt/kde3/share/icons/*/*/*/khotkeys.*
+/opt/kde3/bin/khotkeys
+/opt/kde3/%_lib/kconf_update_bin/khotkeys_update
+/opt/kde3/%_lib/kde3/khotkeys.*
+/opt/kde3/%_lib/kde3/kded_khotkeys.*
+/opt/kde3/%_lib/libkhotkeys_shared.so.*
+/opt/kde3/share/applications/kde/khotkeys.desktop
+/opt/kde3/share/apps/khotkeys
+/opt/kde3/share/services/kded/khotkeys.desktop
+/opt/kde3/bin/ksysguard
+/opt/kde3/share/applications/kde/ksysguard.desktop
+/opt/kde3/share/apps/ksysguard
+/opt/kde3/share/icons/*/*/*/ksysguard.*
+/opt/kde3/share/mimelnk/application/x-ksysguard.desktop
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/ksysguard
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kxkb
+/opt/kde3/%_lib/libksgrd.so.*
+/opt/kde3/bin/kompmgr
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kompmgr
+%if 0%{?with_hal} == 0
+/opt/kde3/bin/devmon-automounter.sh
+%endif
+
+%files runtime
+%defattr(-,root,root)
+%doc %lang(en) /opt/kde3/share/doc/HTML/en/kioslave
+%exclude /opt/kde3/%_lib/kde3/kio_smb.*
+%exclude /opt/kde3/share/services/smb.protocol
+/opt/kde3/bin/kde3
+/opt/kde3/bin/kreadconfig
+/opt/kde3/bin/kwriteconfig
+/opt/kde3/bin/kprinter
+/opt/kde3/%_lib/libkdeinit_kprinter.so
+/opt/kde3/bin/kdesu
+/opt/kde3/%_lib/kde3/kio_*
+/opt/kde3/%_lib/libkfontinst.so.*
+/opt/kde3/share/services/*.protocol
+/opt/kde3/%_lib/libkonq.so.*
+/opt/kde3/%_lib/libkonqsidebarplugin.so.*
+/opt/kde3/%_lib/kde3/kded_favicons.*
+/opt/kde3/share/services/kded/favicons.desktop
+/opt/kde3/%_lib/libkdecorations.so.*
+/opt/kde3/%_lib/kde3/kgreet_winbind.*
+/opt/kde3/%_lib/kde3/kgreet_classic.*
+%config /etc/pam.d/kcheckpass
+%verify(not mode) %attr(4755,root,shadow) /opt/kde3/bin/kcheckpass
+/opt/kde3/share/icons/*/*/*/knotify.*
+/opt/kde3/share/icons/*/*/*/kscreensaver.*
+/opt/kde3/share/icons/*/*/*/style.*
+/opt/kde3/share/icons/*/*/*/looknfeel.*
+/opt/kde3/share/icons/*/*/*/iconthemes.*
+/opt/kde3/share/icons/*/*/*/keyboard.*
+/opt/kde3/share/icons/*/*/*/kcmsound.*
+/opt/kde3/share/icons/*/*/*/energy.*
+/opt/kde3/share/icons/*/*/*/kcmkwm.*
+/opt/kde3/share/icons/*/*/*/hwinfo.*
+/opt/kde3/share/icons/*/*/*/date.*
+/opt/kde3/share/icons/*/*/*/filetypes.*
+/opt/kde3/share/icons/*/*/*/kcmsystem.*
+/opt/kde3/share/icons/*/*/*/personal.*
+
+%changelog
diff --git a/opensuse/tdebase/teach-minicli-lock.diff b/opensuse/tdebase/teach-minicli-lock.diff
new file mode 100644
index 000000000..73bd7da1e
--- /dev/null
+++ b/opensuse/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/tdebase/uninit.diff b/opensuse/tdebase/uninit.diff
new file mode 100644
index 000000000..92dd544ab
--- /dev/null
+++ b/opensuse/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/tdebase/use-full-hinting-by-default.diff b/opensuse/tdebase/use-full-hinting-by-default.diff
new file mode 100644
index 000000000..3375f0943
--- /dev/null
+++ b/opensuse/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/tdebase/use-pam-before-classic.diff b/opensuse/tdebase/use-pam-before-classic.diff
new file mode 100644
index 000000000..4f2a00008
--- /dev/null
+++ b/opensuse/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/tdebase/wizard_small.png b/opensuse/tdebase/wizard_small.png
new file mode 100644
index 000000000..52233e341
--- /dev/null
+++ b/opensuse/tdebase/wizard_small.png
Binary files differ
diff --git a/opensuse/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff b/opensuse/tdebase/workaround-pdf-on64bit-nsplugin-bug.diff
new file mode 100644
index 000000000..b5681e0a3
--- /dev/null
+++ b/opensuse/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/tdebase/xcursor.diff b/opensuse/tdebase/xcursor.diff
new file mode 100644
index 000000000..8c4010915
--- /dev/null
+++ b/opensuse/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/tdebase/xinerama.patch b/opensuse/tdebase/xinerama.patch
new file mode 100644
index 000000000..41aedbcba
--- /dev/null
+++ b/opensuse/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/tdebase/zh_TW.flag.png b/opensuse/tdebase/zh_TW.flag.png
new file mode 100644
index 000000000..472e3376a
--- /dev/null
+++ b/opensuse/tdebase/zh_TW.flag.png
Binary files differ
diff --git a/opensuse/tdelibs/kdelibs-3.5.12.99.tar.bz2 b/opensuse/tdelibs/kdelibs-3.5.12.99.tar.bz2
new file mode 100644
index 000000000..9d4c96c44
--- /dev/null
+++ b/opensuse/tdelibs/kdelibs-3.5.12.99.tar.bz2
Binary files differ
diff --git a/opensuse/tdelibs/tdelibs.spec b/opensuse/tdelibs/tdelibs.spec
index 2a51059ea..4e238d06f 100644
--- a/opensuse/tdelibs/tdelibs.spec
+++ b/opensuse/tdelibs/tdelibs.spec
@@ -197,8 +197,7 @@ License: BSD3c(or similar) ; GPLv2+ ; LGPLv2.1+
Requires: libtqt4-devel libvorbis-devel tdelibs = %version autoconf automake libxslt-devel libxml2-devel libart_lgpl-devel libjpeg-devel tde-filesystem
# next line from tde-devel-packages macro
Requires: tdelibs-doc libtiff-devel openssl-devel update-desktop-files
-# FIXME dbus-1-qt3-devel to what?
-Requires: libdrm-devel dbus-1-qt3-devel
+Requires: libdrm-devel dbus-1-tqt-devel
Requires: libattr-devel libacl-devel
Requires: tdelibs-arts
Summary: Trinity Base Package: Build Environment