haiku/src/apps/login/DesktopWindow.cpp

102 lines
2.3 KiB
C++

/*
* Copyright 2008, François Revol, <revol@free.fr>. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <string.h>
#include <stdio.h>
#include <Catalog.h>
#include <Directory.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <Path.h>
#include <Screen.h>
#include <View.h>
#include <WindowPrivate.h>
#include "LoginApp.h"
#include "DesktopWindow.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Desktop Window"
DesktopWindow::DesktopWindow(BRect frame, bool editMode)
: BWindow(frame, B_TRANSLATE("Desktop"),
kDesktopWindowLook,
kDesktopWindowFeel,
B_NOT_MOVABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE
| B_NOT_MINIMIZABLE | B_NOT_RESIZABLE
| B_ASYNCHRONOUS_CONTROLS,
editMode?B_CURRENT_WORKSPACE:B_ALL_WORKSPACES),
fEditShelfMode(editMode)
{
BScreen screen;
BView *desktop = new BView(Bounds(), "desktop", B_FOLLOW_NONE, 0);
desktop->SetViewColor(screen.DesktopColor());
AddChild(desktop);
// load the shelf
BPath path;
status_t err;
entry_ref ref;
err = find_directory(B_SYSTEM_SETTINGS_DIRECTORY, &path, true);
if (err >= B_OK) {
BDirectory dir(path.Path());
if (!dir.Contains("x-vnd.Haiku-Login", B_DIRECTORY_NODE))
dir.CreateDirectory("x-vnd.Haiku-Login", NULL);
path.Append("x-vnd.Haiku-Login");
dir.SetTo(path.Path());
if (!dir.Contains("Shelf", B_FILE_NODE))
dir.CreateFile("Shelf", NULL);
path.Append("Shelf");
get_ref_for_path(path.Path(), &ref);
}
fDesktopShelf = new BShelf(&ref, desktop, fEditShelfMode, "DesktopShelf");
if (fDesktopShelf)
fDesktopShelf->SetDisplaysZombies(true);
}
DesktopWindow::~DesktopWindow()
{
delete fDesktopShelf;
}
bool
DesktopWindow::QuitRequested()
{
status_t err;
err = fDesktopShelf->Save();
printf(B_TRANSLATE_COMMENT("error %s\n",
"A return message from fDesktopShelf->Save(). It can be \"B_OK\""),
strerror(err));
return BWindow::QuitRequested();
}
void
DesktopWindow::DispatchMessage(BMessage *message, BHandler *handler)
{
switch (message->what) {
case B_MOUSE_DOWN:
case B_MOUSE_UP:
case B_MOUSE_MOVED:
case B_KEY_DOWN:
case B_KEY_UP:
case B_UNMAPPED_KEY_DOWN:
case B_UNMAPPED_KEY_UP:
/* don't allow interacting with the replicants */
if (!fEditShelfMode)
break;
default:
BWindow::DispatchMessage(message, handler);
}
}