Add an option to live in the Deskbar
* Apply reworked version of the patch from "RQ" in #8156 that adds a "live in the deskbar" menu item. * Also added a "Remove replicant" menu item for the replicant case.
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include <Alert.h>
|
#include <Alert.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Catalog.h>
|
#include <Catalog.h>
|
||||||
|
#include <Deskbar.h>
|
||||||
#include <Dragger.h>
|
#include <Dragger.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
@@ -40,7 +41,9 @@
|
|||||||
#define B_TRANSLATE_CONTEXT "Workspaces"
|
#define B_TRANSLATE_CONTEXT "Workspaces"
|
||||||
|
|
||||||
|
|
||||||
|
static const char* kDeskbarItemName = "workspaces";
|
||||||
static const char* kSignature = "application/x-vnd.Be-WORK";
|
static const char* kSignature = "application/x-vnd.Be-WORK";
|
||||||
|
static const char* kDeskbarSignature = "application/x-vnd.Be-TSKB";
|
||||||
static const char* kScreenPrefletSignature = "application/x-vnd.Haiku-Screen";
|
static const char* kScreenPrefletSignature = "application/x-vnd.Haiku-Screen";
|
||||||
static const char* kOldSettingFile = "Workspace_data";
|
static const char* kOldSettingFile = "Workspace_data";
|
||||||
static const char* kSettingsFile = "Workspaces_settings";
|
static const char* kSettingsFile = "Workspaces_settings";
|
||||||
@@ -50,9 +53,11 @@ static const uint32 kMsgToggleTitle = 'tgTt';
|
|||||||
static const uint32 kMsgToggleBorder = 'tgBd';
|
static const uint32 kMsgToggleBorder = 'tgBd';
|
||||||
static const uint32 kMsgToggleAutoRaise = 'tgAR';
|
static const uint32 kMsgToggleAutoRaise = 'tgAR';
|
||||||
static const uint32 kMsgToggleAlwaysOnTop = 'tgAT';
|
static const uint32 kMsgToggleAlwaysOnTop = 'tgAT';
|
||||||
|
static const uint32 kMsgToggleLiveInDeskbar = 'tgDb';
|
||||||
|
|
||||||
static const float kScreenBorderOffset = 10.0;
|
static const float kScreenBorderOffset = 10.0;
|
||||||
|
|
||||||
|
extern "C" _EXPORT BView* instantiate_deskbar_item();
|
||||||
|
|
||||||
class WorkspacesSettings {
|
class WorkspacesSettings {
|
||||||
public:
|
public:
|
||||||
@@ -89,7 +94,7 @@ class WorkspacesSettings {
|
|||||||
|
|
||||||
class WorkspacesView : public BView {
|
class WorkspacesView : public BView {
|
||||||
public:
|
public:
|
||||||
WorkspacesView(BRect frame);
|
WorkspacesView(BRect frame, bool showDragger);
|
||||||
WorkspacesView(BMessage* archive);
|
WorkspacesView(BMessage* archive);
|
||||||
~WorkspacesView();
|
~WorkspacesView();
|
||||||
|
|
||||||
@@ -331,19 +336,21 @@ WorkspacesSettings::SetWindowFrame(BRect frame)
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
WorkspacesView::WorkspacesView(BRect frame)
|
WorkspacesView::WorkspacesView(BRect frame, bool showDragger=true)
|
||||||
:
|
:
|
||||||
BView(frame, "workspaces", B_FOLLOW_ALL,
|
BView(frame, kDeskbarItemName, B_FOLLOW_ALL,
|
||||||
kWorkspacesViewFlag | B_FRAME_EVENTS),
|
kWorkspacesViewFlag | B_FRAME_EVENTS),
|
||||||
fParentWhichDrawsOnChildren(NULL),
|
fParentWhichDrawsOnChildren(NULL),
|
||||||
fCurrentFrame(frame)
|
fCurrentFrame(frame)
|
||||||
{
|
{
|
||||||
frame.OffsetTo(B_ORIGIN);
|
if(showDragger) {
|
||||||
frame.top = frame.bottom - 7;
|
frame.OffsetTo(B_ORIGIN);
|
||||||
frame.left = frame.right - 7;
|
frame.top = frame.bottom - 7;
|
||||||
BDragger* dragger = new BDragger(frame, this,
|
frame.left = frame.right - 7;
|
||||||
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
BDragger* dragger = new BDragger(frame, this,
|
||||||
AddChild(dragger);
|
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
||||||
|
AddChild(dragger);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -498,6 +505,16 @@ WorkspacesView::MessageReceived(BMessage* message)
|
|||||||
be_roster->Launch(kScreenPrefletSignature);
|
be_roster->Launch(kScreenPrefletSignature);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kMsgToggleLiveInDeskbar:
|
||||||
|
{
|
||||||
|
// only actually used from the replicant itself
|
||||||
|
// since HasItem() locks up we just remove directly.
|
||||||
|
BDeskbar deskbar;
|
||||||
|
// we shouldn't do this here actually, but it works for now...
|
||||||
|
deskbar.RemoveItem (kDeskbarItemName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BView::MessageReceived(message);
|
BView::MessageReceived(message);
|
||||||
break;
|
break;
|
||||||
@@ -554,6 +571,7 @@ WorkspacesView::MouseDown(BPoint where)
|
|||||||
|
|
||||||
WorkspacesWindow* window = dynamic_cast<WorkspacesWindow*>(Window());
|
WorkspacesWindow* window = dynamic_cast<WorkspacesWindow*>(Window());
|
||||||
if (window != NULL) {
|
if (window != NULL) {
|
||||||
|
// inside Workspaces app
|
||||||
BMenuItem* item;
|
BMenuItem* item;
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
@@ -576,6 +594,12 @@ WorkspacesView::MouseDown(BPoint where)
|
|||||||
new BMessage(kMsgToggleAutoRaise)));
|
new BMessage(kMsgToggleAutoRaise)));
|
||||||
if (window->IsAutoRaising())
|
if (window->IsAutoRaising())
|
||||||
item->SetMarked(true);
|
item->SetMarked(true);
|
||||||
|
if (be_roster->IsRunning(kDeskbarSignature)) {
|
||||||
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Live in the Deskbar"),
|
||||||
|
new BMessage(kMsgToggleLiveInDeskbar)));
|
||||||
|
BDeskbar deskbar;
|
||||||
|
item->SetMarked(deskbar.HasItem(kDeskbarItemName));
|
||||||
|
}
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(new BMenuItem(B_TRANSLATE("About Workspaces"
|
menu->AddItem(new BMenuItem(B_TRANSLATE("About Workspaces"
|
||||||
@@ -583,6 +607,25 @@ WorkspacesView::MouseDown(BPoint where)
|
|||||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Quit"),
|
menu->AddItem(new BMenuItem(B_TRANSLATE("Quit"),
|
||||||
new BMessage(B_QUIT_REQUESTED)));
|
new BMessage(B_QUIT_REQUESTED)));
|
||||||
menu->SetTargetForItems(window);
|
menu->SetTargetForItems(window);
|
||||||
|
} else {
|
||||||
|
// we're replicated in some way...
|
||||||
|
BMenuItem* item;
|
||||||
|
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
|
// check which way
|
||||||
|
BDragger *dragger = dynamic_cast<BDragger*>(ChildAt(0));
|
||||||
|
if (dragger) {
|
||||||
|
// replicant
|
||||||
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Remove replicant"),
|
||||||
|
new BMessage(B_TRASH_TARGET)));
|
||||||
|
item->SetTarget(dragger);
|
||||||
|
} else {
|
||||||
|
// Deskbar item
|
||||||
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Remove replicant"),
|
||||||
|
new BMessage(kMsgToggleLiveInDeskbar)));
|
||||||
|
item->SetTarget(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
changeItem->SetTarget(this);
|
changeItem->SetTarget(this);
|
||||||
@@ -773,6 +816,19 @@ WorkspacesWindow::MessageReceived(BMessage *message)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case kMsgToggleLiveInDeskbar:
|
||||||
|
{
|
||||||
|
BDeskbar deskbar;
|
||||||
|
if (deskbar.HasItem (kDeskbarItemName))
|
||||||
|
deskbar.RemoveItem (kDeskbarItemName);
|
||||||
|
else {
|
||||||
|
entry_ref ref;
|
||||||
|
be_roster->FindApp(kSignature, &ref);
|
||||||
|
deskbar.AddItem(&ref);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BWindow::MessageReceived(message);
|
BWindow::MessageReceived(message);
|
||||||
break;
|
break;
|
||||||
@@ -904,6 +960,12 @@ WorkspacesApp::ArgvReceived(int32 argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BView* instantiate_deskbar_item()
|
||||||
|
{
|
||||||
|
return new WorkspacesView(BRect (0, 0, 75, 15), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WorkspacesApp::ReadyToRun()
|
WorkspacesApp::ReadyToRun()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user