diff --git a/src/add-ons/input_server/devices/keyboard/TeamListItem.cpp b/src/add-ons/input_server/devices/keyboard/TeamListItem.cpp index 49da1ffa53..0a41047f3e 100644 --- a/src/add-ons/input_server/devices/keyboard/TeamListItem.cpp +++ b/src/add-ons/input_server/devices/keyboard/TeamListItem.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -34,6 +35,10 @@ TeamListItem::TeamListItem(team_info &tinfo) nodeInfo.GetTrackerIcon(&fIcon, B_MINI_ICON); nodeInfo.GetTrackerIcon(&fLargeIcon, B_LARGE_ICON); } + + app_info appInfo; + if (be_roster->GetRunningAppInfo(fInfo.team, &appInfo) == B_OK) + fAppSignature = appInfo.signature; } @@ -145,3 +150,13 @@ TeamListItem::IsSystemServer() return false; } + + +bool +TeamListItem::IsApplication() +{ + if (fAppSignature.Length() > 0) + return true; + else + return false; +} diff --git a/src/add-ons/input_server/devices/keyboard/TeamListItem.h b/src/add-ons/input_server/devices/keyboard/TeamListItem.h index aab5553249..4d61c696b0 100644 --- a/src/add-ons/input_server/devices/keyboard/TeamListItem.h +++ b/src/add-ons/input_server/devices/keyboard/TeamListItem.h @@ -12,6 +12,7 @@ #include #include #include +#include class TeamListItem : public BListItem { @@ -26,7 +27,9 @@ public: const team_info* GetInfo(); const BBitmap* LargeIcon() { return &fLargeIcon; }; const BPath* Path() { return &fPath; }; + const BString* AppSignature() { return &fAppSignature; }; bool IsSystemServer(); + bool IsApplication(); bool Found() const { return fFound; } void SetFound(bool found) { fFound = found; } @@ -37,6 +40,7 @@ private: team_info fInfo; BBitmap fIcon, fLargeIcon; BPath fPath; + BString fAppSignature; bool fFound; }; diff --git a/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.cpp b/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.cpp index 715d11be1d..054400d4da 100644 --- a/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.cpp +++ b/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.cpp @@ -59,6 +59,7 @@ static const uint32 kMsgLaunchTerminal = 'TMlt'; const uint32 TM_CANCEL = 'TMca'; const uint32 TM_FORCE_REBOOT = 'TMfr'; const uint32 TM_KILL_APPLICATION = 'TMka'; +const uint32 TM_QUIT_APPLICATION = 'TMqa'; const uint32 TM_RESTART_DESKTOP = 'TMrd'; const uint32 TM_SELECTED_TEAM = 'TMst'; @@ -96,6 +97,11 @@ TeamMonitorWindow::TeamMonitorWindow() new BMessage(TM_KILL_APPLICATION)); groupView->AddChild(fKillButton); fKillButton->SetEnabled(false); + + fQuitButton = new BButton("quit", "Quit Application", + new BMessage(TM_QUIT_APPLICATION)); + groupView->AddChild(fQuitButton); + fQuitButton->SetEnabled(false); groupView->GroupLayout()->AddItem(BSpaceLayoutItem::CreateGlue()); @@ -195,6 +201,18 @@ TeamMonitorWindow::MessageReceived(BMessage *msg) } break; } + case TM_QUIT_APPLICATION: + { + TeamListItem* item = dynamic_cast(fListView->ItemAt( + fListView->CurrentSelection())); + if (item != NULL) { + BMessenger messenger(item->AppSignature()->String(), + item->GetInfo()->team); + messenger.SendMessage(B_QUIT_REQUESTED); + UpdateList(); + } + break; + } case TM_RESTART_DESKTOP: { if (!be_roster->IsRunning(kTrackerSignature)) @@ -211,6 +229,7 @@ TeamMonitorWindow::MessageReceived(BMessage *msg) TeamListItem* item = (TeamListItem*)fListView->ItemAt( fListView->CurrentSelection()); fDescriptionView->SetItem(item); + fQuitButton->SetEnabled(item && item->IsApplication()); break; } case TM_CANCEL: @@ -273,6 +292,7 @@ TeamMonitorWindow::UpdateList() if (item == fDescriptionView->Item()) { fDescriptionView->SetItem(NULL); fKillButton->SetEnabled(false); + fQuitButton->SetEnabled(false); } delete fListView->RemoveItem(i); diff --git a/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.h b/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.h index 3eade282de..86e005066d 100644 --- a/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.h +++ b/src/add-ons/input_server/devices/keyboard/TeamMonitorWindow.h @@ -39,6 +39,7 @@ private: BListView* fListView; BButton* fCancelButton; BButton* fKillButton; + BButton* fQuitButton; BButton* fRestartButton; TeamDescriptionView* fDescriptionView; };