1/* 2 * Copyright 2008, Fran��ois Revol, <revol@free.fr>. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <string.h> 8#include <stdio.h> 9 10#include <Catalog.h> 11#include <Directory.h> 12#include <Entry.h> 13#include <FindDirectory.h> 14#include <Path.h> 15#include <Screen.h> 16#include <View.h> 17#include <WindowPrivate.h> 18 19#include "LoginApp.h" 20#include "DesktopWindow.h" 21 22#undef B_TRANSLATION_CONTEXT 23#define B_TRANSLATION_CONTEXT "Desktop Window" 24 25 26DesktopWindow::DesktopWindow(BRect frame, bool editMode) 27 : BWindow(frame, B_TRANSLATE("Desktop"), 28 kDesktopWindowLook, 29 kDesktopWindowFeel, 30 B_NOT_MOVABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE 31 | B_NOT_MINIMIZABLE | B_NOT_RESIZABLE 32 | B_ASYNCHRONOUS_CONTROLS, 33 editMode?B_CURRENT_WORKSPACE:B_ALL_WORKSPACES), 34 fEditShelfMode(editMode) 35{ 36 BScreen screen; 37 BView *desktop = new BView(Bounds(), "desktop", B_FOLLOW_NONE, 0); 38 desktop->SetViewColor(screen.DesktopColor()); 39 AddChild(desktop); 40 41 // load the shelf 42 BPath path; 43 status_t err; 44 entry_ref ref; 45 err = find_directory(B_SYSTEM_SETTINGS_DIRECTORY, &path, true); 46 if (err >= B_OK) { 47 BDirectory dir(path.Path()); 48 if (!dir.Contains("x-vnd.Haiku-Login", B_DIRECTORY_NODE)) 49 dir.CreateDirectory("x-vnd.Haiku-Login", NULL); 50 path.Append("x-vnd.Haiku-Login"); 51 dir.SetTo(path.Path()); 52 if (!dir.Contains("Shelf", B_FILE_NODE)) 53 dir.CreateFile("Shelf", NULL); 54 path.Append("Shelf"); 55 get_ref_for_path(path.Path(), &ref); 56 } 57 58 fDesktopShelf = new BShelf(&ref, desktop, fEditShelfMode, "DesktopShelf"); 59 if (fDesktopShelf) 60 fDesktopShelf->SetDisplaysZombies(true); 61} 62 63 64DesktopWindow::~DesktopWindow() 65{ 66 delete fDesktopShelf; 67} 68 69 70bool 71DesktopWindow::QuitRequested() 72{ 73 status_t err; 74 err = fDesktopShelf->Save(); 75 printf(B_TRANSLATE_COMMENT("error %s\n", 76 "A return message from fDesktopShelf->Save(). It can be \"B_OK\""), 77 strerror(err)); 78 return BWindow::QuitRequested(); 79} 80 81 82void 83DesktopWindow::DispatchMessage(BMessage *message, BHandler *handler) 84{ 85 switch (message->what) { 86 case B_MOUSE_DOWN: 87 case B_MOUSE_UP: 88 case B_MOUSE_MOVED: 89 case B_KEY_DOWN: 90 case B_KEY_UP: 91 case B_UNMAPPED_KEY_DOWN: 92 case B_UNMAPPED_KEY_UP: 93 /* don't allow interacting with the replicants */ 94 if (!fEditShelfMode) 95 break; 96 default: 97 BWindow::DispatchMessage(message, handler); 98 } 99} 100 101 102