diff --git a/src/add-ons/input_server/devices/keyboard/Jamfile b/src/add-ons/input_server/devices/keyboard/Jamfile
index 4392dd5f3a..d6084abd45 100644
--- a/src/add-ons/input_server/devices/keyboard/Jamfile
+++ b/src/add-ons/input_server/devices/keyboard/Jamfile
@@ -2,8 +2,7 @@ SubDir HAIKU_TOP src add-ons input_server devices keyboard ;
SetSubDirSupportedPlatformsBeOSCompatible ;
-UsePrivateHeaders input ;
-UsePrivateHeaders kernel ;
+UsePrivateHeaders input kernel tracker ;
UseArchHeaders $(TARGET_ARCH) ;
Addon keyboard : input_server/devices :
diff --git a/src/add-ons/input_server/devices/keyboard/TMWindow.cpp b/src/add-ons/input_server/devices/keyboard/TMWindow.cpp
index 1fbb94207b..8596802ab8 100644
--- a/src/add-ons/input_server/devices/keyboard/TMWindow.cpp
+++ b/src/add-ons/input_server/devices/keyboard/TMWindow.cpp
@@ -18,7 +18,10 @@
#include "TMListItem.h"
#include "KeyboardInputDevice.h"
+#include "tracker_private.h"
+
#include
+#include
#include
#include
#include
@@ -27,6 +30,7 @@
const uint32 TM_CANCEL = 'TMca';
const uint32 TM_FORCE_REBOOT = 'TMfr';
const uint32 TM_KILL_APPLICATION = 'TMka';
+const uint32 TM_RESTART_DESKTOP = 'TMrd';
const uint32 TM_SELECTED_TEAM = 'TMst';
#ifndef __HAIKU__
@@ -165,6 +169,14 @@ TMView::TMView(BRect bounds, const char* name, uint32 resizeFlags,
new BMessage(TM_FORCE_REBOOT), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM);
AddChild(forceReboot);
+ BRect restartRect = rect;
+ restartRect.left = rect.right + 20;
+ restartRect.right = restartRect.left + font.StringWidth("Restart the Desktop") + 20;
+ BButton *fRestartButton = new BButton(restartRect, "restart", "Restart the Desktop",
+ new BMessage(TM_RESTART_DESKTOP), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM);
+ AddChild(fRestartButton);
+ fRestartButton->Hide();
+
rect.left += 4;
rect.bottom = rect.top - 8;
rect.top = fKillButton->Frame().bottom + 8;
@@ -204,6 +216,14 @@ TMView::MessageReceived(BMessage *msg)
UpdateList();
break;
}
+ case TM_RESTART_DESKTOP: {
+ fRestartButton->SetEnabled(false);
+ if (!be_roster->IsRunning(kTrackerSignature))
+ be_roster->Launch(kTrackerSignature);
+ if (!be_roster->IsRunning(kDeskbarSignature))
+ be_roster->Launch(kDeskbarSignature);
+ break;
+ }
case TM_SELECTED_TEAM: {
fKillButton->SetEnabled(fListView->CurrentSelection() >= 0);
TMListItem *item = (TMListItem*)ListView()->ItemAt(
@@ -279,6 +299,13 @@ TMView::UpdateList()
if (changed)
fListView->Invalidate();
+
+ bool desktopRunning = be_roster->IsRunning(kTrackerSignature)
+ && be_roster->IsRunning(kDeskbarSignature);
+ if (desktopRunning ^ fRestartButton->IsHidden())
+ fRestartButton->Show();
+ if (!desktopRunning)
+ fRestartButton->SetEnabled(true);
}
diff --git a/src/add-ons/input_server/devices/keyboard/TMWindow.h b/src/add-ons/input_server/devices/keyboard/TMWindow.h
index da26c8487c..4a864a8104 100644
--- a/src/add-ons/input_server/devices/keyboard/TMWindow.h
+++ b/src/add-ons/input_server/devices/keyboard/TMWindow.h
@@ -46,6 +46,7 @@ class TMView : public BBox {
private:
BListView *fListView;
BButton *fKillButton;
+ BButton *fRestartButton;
TMDescView *fDescView;
};