Tracker now also restores the previously opened windows from volumes that were
mounted later by the AutoMounter's initial mounting loop. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21653 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -82,8 +82,7 @@ AutoMounter::AutoMounter()
|
|||||||
fRemovableMode = kNoVolumes;
|
fRemovableMode = kNoVolumes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PostMessage(kMsgInitialScan) != B_OK)
|
PostMessage(kMsgInitialScan);
|
||||||
debug_printf("AutoMounter: OH NO!\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -93,7 +92,8 @@ AutoMounter::~AutoMounter()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AutoMounter::_MountVolumes(mount_mode normal, mount_mode removable)
|
AutoMounter::_MountVolumes(mount_mode normal, mount_mode removable,
|
||||||
|
bool initialRescan)
|
||||||
{
|
{
|
||||||
if (normal == kNoVolumes && removable == kNoVolumes)
|
if (normal == kNoVolumes && removable == kNoVolumes)
|
||||||
return;
|
return;
|
||||||
@@ -145,7 +145,13 @@ AutoMounter::_MountVolumes(mount_mode normal, mount_mode removable)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
partition->Mount();
|
if (partition->Mount() == B_OK) {
|
||||||
|
// notify Tracker that a new volume has been started
|
||||||
|
BMessage note(kVolumeMounted);
|
||||||
|
note.AddString("path", partition->MountedAt());
|
||||||
|
note.AddBool("initial rescan", sInitialRescan);
|
||||||
|
be_app->PostMessage(¬e);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +451,7 @@ AutoMounter::MessageReceived(BMessage *message)
|
|||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
case kMsgInitialScan:
|
case kMsgInitialScan:
|
||||||
_MountVolumes(fNormalMode, fRemovableMode);
|
_MountVolumes(fNormalMode, fRemovableMode, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kMountVolume:
|
case kMountVolume:
|
||||||
@@ -466,12 +472,12 @@ AutoMounter::MessageReceived(BMessage *message)
|
|||||||
_WriteSettings();
|
_WriteSettings();
|
||||||
|
|
||||||
if (rescanNow)
|
if (rescanNow)
|
||||||
_MountVolumes(fNormalMode, fRemovableMode);
|
_MountVolumes(fNormalMode, fRemovableMode, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case kMountAllNow:
|
case kMountAllNow:
|
||||||
_MountVolumes(kAllVolumes, kAllVolumes);
|
_MountVolumes(kAllVolumes, kAllVolumes, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -588,6 +594,7 @@ static const uint32 kStartPolling = 'strp';
|
|||||||
|
|
||||||
static BMessage gSettingsMessage;
|
static BMessage gSettingsMessage;
|
||||||
static bool gSilentAutoMounter;
|
static bool gSilentAutoMounter;
|
||||||
|
static bool sInitialRescan;
|
||||||
|
|
||||||
struct OneMountFloppyParams {
|
struct OneMountFloppyParams {
|
||||||
status_t result;
|
status_t result;
|
||||||
@@ -652,6 +659,13 @@ MountAndWatch(Partition *partition)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// notify Tracker that a new volume has been started
|
||||||
|
BMessage note(kVolumeMounted);
|
||||||
|
note.AddString("path", partition->MountedAt());
|
||||||
|
note.AddBool("initial rescan", sInitialRescan);
|
||||||
|
be_app->PostMessage(¬e);
|
||||||
|
|
||||||
return AutoMounterWatchNode(&nodeToWatch, B_WATCH_NAME);
|
return AutoMounterWatchNode(&nodeToWatch, B_WATCH_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -965,6 +979,7 @@ AutoMounter::AutoMounter(bool checkRemovableOnly, bool checkCDs,
|
|||||||
|
|
||||||
if (!BootedInSafeMode()) {
|
if (!BootedInSafeMode()) {
|
||||||
ReadSettings();
|
ReadSettings();
|
||||||
|
sInitialRescan = true;
|
||||||
thread_id rescan = spawn_thread(AutoMounter::InitialRescanBinder,
|
thread_id rescan = spawn_thread(AutoMounter::InitialRescanBinder,
|
||||||
"AutomountInitialScan", B_DISPLAY_PRIORITY, this);
|
"AutomountInitialScan", B_DISPLAY_PRIORITY, this);
|
||||||
resume_thread(rescan);
|
resume_thread(rescan);
|
||||||
@@ -1462,6 +1477,8 @@ AutoMounter::InitialRescan()
|
|||||||
//+ PRINT(("restoring all volumes\n"));
|
//+ PRINT(("restoring all volumes\n"));
|
||||||
fList.EachMountablePartition(TryMountingRestoreOne, NULL);
|
fList.EachMountablePartition(TryMountingRestoreOne, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sInitialRescan = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ namespace BPrivate {
|
|||||||
const uint32 kMountVolume = 'mntv';
|
const uint32 kMountVolume = 'mntv';
|
||||||
const uint32 kMountAllNow = 'mntn';
|
const uint32 kMountAllNow = 'mntn';
|
||||||
const uint32 kSetAutomounterParams = 'pmst';
|
const uint32 kSetAutomounterParams = 'pmst';
|
||||||
|
const uint32 kVolumeMounted = 'vmtd';
|
||||||
|
|
||||||
#ifdef __HAIKU__
|
#ifdef __HAIKU__
|
||||||
// #pragma mark - Haiku Disk Device API
|
// #pragma mark - Haiku Disk Device API
|
||||||
@@ -69,7 +70,8 @@ class AutoMounter : public BLooper {
|
|||||||
kRestorePreviousVolumes
|
kRestorePreviousVolumes
|
||||||
};
|
};
|
||||||
|
|
||||||
void _MountVolumes(mount_mode normal, mount_mode removable);
|
void _MountVolumes(mount_mode normal, mount_mode removable,
|
||||||
|
bool initialRescan);
|
||||||
void _MountVolume(BMessage* message);
|
void _MountVolume(BMessage* message);
|
||||||
bool _ForceUnmount(const char* name, status_t error);
|
bool _ForceUnmount(const char* name, status_t error);
|
||||||
void _ReportUnmountError(const char* name, status_t error);
|
void _ReportUnmountError(const char* name, status_t error);
|
||||||
|
|||||||
+124
-86
@@ -390,9 +390,9 @@ TTracker::MessageReceived(BMessage *message)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case kUnmountVolume:
|
case kUnmountVolume:
|
||||||
// When the user attempts to unmount a volume from the mount
|
// When the user attempts to unmount a volume from the mount
|
||||||
// context menu, this is where the message gets received. Save
|
// context menu, this is where the message gets received.
|
||||||
// pose locations and forward this to the automounter
|
// Save pose locations and forward this to the automounter
|
||||||
SaveAllPoseLocations();
|
SaveAllPoseLocations();
|
||||||
fAutoMounter->PostMessage(message);
|
fAutoMounter->PostMessage(message);
|
||||||
break;
|
break;
|
||||||
@@ -401,16 +401,26 @@ TTracker::MessageReceived(BMessage *message)
|
|||||||
AutomountSettingsDialog::RunAutomountSettings(fAutoMounter);
|
AutomountSettingsDialog::RunAutomountSettings(fAutoMounter);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kShowSplash:
|
case kVolumeMounted:
|
||||||
{
|
{
|
||||||
// The AboutWindow was moved out of the Tracker in preparation
|
// This is sent to us by the AutoMounter whenever it mounts
|
||||||
// for when we open source it. The AboutBox contains important
|
// a new volume - we use it to restore the previously opened
|
||||||
// credit and license issues that shouldn't be modified, and
|
// windows from that volume in case it has been mounted
|
||||||
// therefore shouldn't be open sourced. However, there is a public
|
// during the AutoMounter's initial rescan
|
||||||
// API for 3rd party apps to tell the Tracker to open the AboutBox.
|
const char* path;
|
||||||
run_be_about();
|
bool initial;
|
||||||
|
if (message->FindBool("initial rescan", &initial) != B_OK
|
||||||
|
|| message->FindString("path", &path) != B_OK
|
||||||
|
|| !initial)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
_OpenPreviouslyOpenedWindows(path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kShowSplash:
|
||||||
|
run_be_about();
|
||||||
|
break;
|
||||||
|
|
||||||
case kAddPrinter:
|
case kAddPrinter:
|
||||||
// show the addprinter window
|
// show the addprinter window
|
||||||
@@ -1185,6 +1195,84 @@ TTracker::CloseAllWindows()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TTracker::_OpenPreviouslyOpenedWindows(const char* pathFilter)
|
||||||
|
{
|
||||||
|
size_t filterLength = 0;
|
||||||
|
if (pathFilter != NULL)
|
||||||
|
filterLength = strlen(pathFilter);
|
||||||
|
|
||||||
|
BVolume bootVolume;
|
||||||
|
BVolumeRoster().GetBootVolume(&bootVolume);
|
||||||
|
BDirectory deskDir;
|
||||||
|
attr_info attrInfo;
|
||||||
|
if (FSGetDeskDir(&deskDir, bootVolume.Device()) != B_OK
|
||||||
|
|| deskDir.GetAttrInfo(kAttrOpenWindows, &attrInfo) != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char *buffer = (char *)malloc((size_t)attrInfo.size);
|
||||||
|
BMessage message;
|
||||||
|
if (deskDir.ReadAttr(kAttrOpenWindows, B_MESSAGE_TYPE, 0, buffer,
|
||||||
|
(size_t)attrInfo.size) != attrInfo.size
|
||||||
|
|| message.Unflatten(buffer) != B_OK) {
|
||||||
|
free(buffer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
node_ref nodeRef;
|
||||||
|
deskDir.GetNodeRef(&nodeRef);
|
||||||
|
|
||||||
|
int32 stateMessageCounter = 0;
|
||||||
|
const char *path;
|
||||||
|
for (int32 i = 0; message.FindString("paths", i, &path) == B_OK; i++) {
|
||||||
|
if (strncmp(path, pathFilter, filterLength))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BEntry entry(path, true);
|
||||||
|
if (entry.InitCheck() != B_OK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int8 flags = 0;
|
||||||
|
for (int32 j = 0; message.FindInt8(path, j, &flags) == B_OK; j++) {
|
||||||
|
Model *model = new Model(&entry);
|
||||||
|
if (model->InitCheck() == B_OK && model->IsContainer()) {
|
||||||
|
BMessage state;
|
||||||
|
bool restoreStateFromMessage = false;
|
||||||
|
if ((flags & kOpenWindowHasState) != 0
|
||||||
|
&& message.FindMessage("window state", stateMessageCounter++,
|
||||||
|
&state) == B_OK)
|
||||||
|
restoreStateFromMessage = true;
|
||||||
|
|
||||||
|
if (restoreStateFromMessage) {
|
||||||
|
OpenContainerWindow(model, 0, kOpen, kRestoreWorkspace
|
||||||
|
| (flags & kOpenWindowMinimized ? kIsHidden : 0U)
|
||||||
|
| kRestoreDecor, false, &state);
|
||||||
|
} else {
|
||||||
|
OpenContainerWindow(model, 0, kOpen, kRestoreWorkspace
|
||||||
|
| (flags & kOpenWindowMinimized ? kIsHidden : 0U)
|
||||||
|
| kRestoreDecor);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
delete model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open disks window if needed
|
||||||
|
|
||||||
|
if (pathFilter == NULL && TrackerSettings().ShowDisksIcon()
|
||||||
|
&& message.HasBool("open_disks_window")) {
|
||||||
|
BEntry entry("/");
|
||||||
|
Model* model = new Model(&entry);
|
||||||
|
if (model->InitCheck() == B_OK)
|
||||||
|
OpenContainerWindow(model, 0, kOpen, kRestoreWorkspace);
|
||||||
|
else
|
||||||
|
delete model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TTracker::ReadyToRun()
|
TTracker::ReadyToRun()
|
||||||
{
|
{
|
||||||
@@ -1206,14 +1294,12 @@ TTracker::ReadyToRun()
|
|||||||
|
|
||||||
fTaskLoop = new StandAloneTaskLoop(true);
|
fTaskLoop = new StandAloneTaskLoop(true);
|
||||||
|
|
||||||
bool openDisksWindow = false;
|
|
||||||
|
|
||||||
// open desktop window
|
// open desktop window
|
||||||
BContainerWindow *deskWindow = NULL;
|
BContainerWindow *deskWindow = NULL;
|
||||||
BVolume bootVol;
|
BVolume bootVolume;
|
||||||
BVolumeRoster().GetBootVolume(&bootVol);
|
BVolumeRoster().GetBootVolume(&bootVolume);
|
||||||
BDirectory deskDir;
|
BDirectory deskDir;
|
||||||
if (FSGetDeskDir(&deskDir, bootVol.Device()) == B_OK) {
|
if (FSGetDeskDir(&deskDir, bootVolume.Device()) == B_OK) {
|
||||||
// create desktop
|
// create desktop
|
||||||
BEntry entry;
|
BEntry entry;
|
||||||
deskDir.GetEntry(&entry);
|
deskDir.GetEntry(&entry);
|
||||||
@@ -1224,86 +1310,38 @@ TTracker::ReadyToRun()
|
|||||||
AutoLock<BWindow> windowLock(deskWindow);
|
AutoLock<BWindow> windowLock(deskWindow);
|
||||||
deskWindow->CreatePoseView(model);
|
deskWindow->CreatePoseView(model);
|
||||||
deskWindow->Init();
|
deskWindow->Init();
|
||||||
|
|
||||||
|
if (TrackerSettings().ShowDisksIcon()) {
|
||||||
|
// create model for root of everything
|
||||||
|
BEntry entry("/");
|
||||||
|
Model model(&entry);
|
||||||
|
if (model.InitCheck() == B_OK) {
|
||||||
|
// add the root icon to desktop window
|
||||||
|
BMessage message;
|
||||||
|
message.what = B_NODE_MONITOR;
|
||||||
|
message.AddInt32("opcode", B_ENTRY_CREATED);
|
||||||
|
message.AddInt32("device", model.NodeRef()->device);
|
||||||
|
message.AddInt64("node", model.NodeRef()->node);
|
||||||
|
message.AddInt64("directory", model.EntryRef()->directory);
|
||||||
|
message.AddString("name", model.EntryRef()->name);
|
||||||
|
deskWindow->PostMessage(&message, deskWindow->PoseView());
|
||||||
|
}
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
delete model;
|
delete model;
|
||||||
|
|
||||||
// open previously open windows
|
// open previously open windows
|
||||||
attr_info attrInfo;
|
if (!BootedInSafeMode())
|
||||||
if (!BootedInSafeMode()
|
_OpenPreviouslyOpenedWindows();
|
||||||
&& deskDir.GetAttrInfo(kAttrOpenWindows, &attrInfo) == B_OK) {
|
|
||||||
char *buffer = (char *)malloc((size_t)attrInfo.size);
|
|
||||||
BMessage message;
|
|
||||||
if (deskDir.ReadAttr(kAttrOpenWindows, B_MESSAGE_TYPE, 0, buffer, (size_t)attrInfo.size)
|
|
||||||
== attrInfo.size
|
|
||||||
&& message.Unflatten(buffer) == B_OK) {
|
|
||||||
|
|
||||||
node_ref nodeRef;
|
|
||||||
deskDir.GetNodeRef(&nodeRef);
|
|
||||||
|
|
||||||
int32 stateMessageCounter = 0;
|
|
||||||
const char *path;
|
|
||||||
for (int32 outer = 0;message.FindString("paths", outer, &path) == B_OK;outer++) {
|
|
||||||
int8 flags = 0;
|
|
||||||
for (int32 inner = 0;message.FindInt8(path, inner, &flags) == B_OK;inner++) {
|
|
||||||
BEntry entry(path, true);
|
|
||||||
if (entry.InitCheck() == B_OK) {
|
|
||||||
Model *model = new Model(&entry);
|
|
||||||
if (model->InitCheck() == B_OK && model->IsContainer()) {
|
|
||||||
BMessage state;
|
|
||||||
bool restoreStateFromMessage = false;
|
|
||||||
if ((flags & kOpenWindowHasState) != 0
|
|
||||||
&& message.FindMessage("window state", stateMessageCounter++, &state) == B_OK)
|
|
||||||
restoreStateFromMessage = true;
|
|
||||||
|
|
||||||
if (restoreStateFromMessage)
|
|
||||||
OpenContainerWindow(model, 0, kOpen,
|
|
||||||
kRestoreWorkspace | (flags & kOpenWindowMinimized ? kIsHidden : 0U) | kRestoreDecor,
|
|
||||||
false, &state);
|
|
||||||
else
|
|
||||||
OpenContainerWindow(model, 0, kOpen,
|
|
||||||
kRestoreWorkspace | (flags & kOpenWindowMinimized ? kIsHidden : 0U) | kRestoreDecor);
|
|
||||||
} else
|
|
||||||
delete model;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.HasBool("open_disks_window"))
|
|
||||||
openDisksWindow = true;
|
|
||||||
}
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create model for root of everything
|
|
||||||
if (deskWindow) {
|
|
||||||
BEntry entry("/");
|
|
||||||
Model model(&entry);
|
|
||||||
if (model.InitCheck() == B_OK) {
|
|
||||||
|
|
||||||
if (TrackerSettings().ShowDisksIcon()) {
|
|
||||||
// add the root icon to desktop window
|
|
||||||
BMessage message;
|
|
||||||
message.what = B_NODE_MONITOR;
|
|
||||||
message.AddInt32("opcode", B_ENTRY_CREATED);
|
|
||||||
message.AddInt32("device", model.NodeRef()->device);
|
|
||||||
message.AddInt64("node", model.NodeRef()->node);
|
|
||||||
message.AddInt64("directory", model.EntryRef()->directory);
|
|
||||||
message.AddString("name", model.EntryRef()->name);
|
|
||||||
deskWindow->PostMessage(&message, deskWindow->PoseView());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (openDisksWindow)
|
|
||||||
OpenContainerWindow(new Model(model), 0, kOpen, kRestoreWorkspace);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// kick off building the mime type list for find panels, etc.
|
// kick off building the mime type list for find panels, etc.
|
||||||
fMimeTypeList = new MimeTypeList();
|
fMimeTypeList = new MimeTypeList();
|
||||||
|
|
||||||
if (!BootedInSafeMode())
|
if (!BootedInSafeMode()) {
|
||||||
// kick of transient query killer
|
// kick of transient query killer
|
||||||
DeleteTransientQueriesTask::StartUpTransientQueryCleaner();
|
DeleteTransientQueriesTask::StartUpTransientQueryCleaner();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MimeTypeList *
|
MimeTypeList *
|
||||||
|
|||||||
@@ -198,6 +198,7 @@ class TTracker : public BApplication {
|
|||||||
OpenSelector openSelector = kOpen, uint32 openFlags = 0,
|
OpenSelector openSelector = kOpen, uint32 openFlags = 0,
|
||||||
bool checkAlreadyOpen = true, const BMessage *stateMessage = NULL);
|
bool checkAlreadyOpen = true, const BMessage *stateMessage = NULL);
|
||||||
// pass either a Model or a list of entries to open
|
// pass either a Model or a list of entries to open
|
||||||
|
void _OpenPreviouslyOpenedWindows(const char* pathFilter = NULL);
|
||||||
|
|
||||||
void SetDefaultPrinter(const BMessage *);
|
void SetDefaultPrinter(const BMessage *);
|
||||||
void EditQueries(const BMessage *);
|
void EditQueries(const BMessage *);
|
||||||
|
|||||||
Reference in New Issue
Block a user