1/* 2 * Copyright 2000, Georges-Edouard Berenger. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "PCWorld.h" 8#include "PCWindow.h" 9#include "Preferences.h" 10#include "ProcessController.h" 11#include "Utilities.h" 12 13#include <Alert.h> 14#include <Application.h> 15#include <Catalog.h> 16#include <Deskbar.h> 17#include <FindDirectory.h> 18#include <Path.h> 19#include <Roster.h> 20 21#include <stdio.h> 22#include <stdlib.h> 23#include <string.h> 24 25 26#undef B_TRANSLATION_CONTEXT 27#define B_TRANSLATION_CONTEXT "ProcessController" 28 29 30class PCApplication : public BApplication { 31public: 32 PCApplication(); 33 virtual ~PCApplication(); 34 35 virtual void ReadyToRun(); 36 virtual void ArgvReceived(int32 argc, char** argv); 37}; 38 39 40const char* kSignature = "application/x-vnd.Haiku-ProcessController"; 41const char* kTrackerSig = "application/x-vnd.Be-TRAK"; 42const char* kDeskbarSig = "application/x-vnd.Be-TSKB"; 43const char* kTerminalSig = "application/x-vnd.Haiku-Terminal"; 44const char* kPreferencesFileName = "ProcessController Prefs"; 45 46const char* kPosPrefName = "Position"; 47const char* kVersionName = "Version"; 48const int kCurrentVersion = 311; 49 50thread_id id = 0; 51 52 53PCApplication::PCApplication() 54 : 55 BApplication(kSignature) 56{ 57} 58 59 60PCApplication::~PCApplication() 61{ 62 if (id) { 63 status_t returnValue; 64 wait_for_thread(id, &returnValue); 65 } 66} 67 68 69void 70PCApplication::ReadyToRun() 71{ 72 BDeskbar deskbar; 73 if (!deskbar.HasItem(kDeskbarItemName)) { 74 // We're not yet installed in the Deskbar, ask if we should 75 BAlert* alert = new BAlert(B_TRANSLATE("Info"), 76 B_TRANSLATE("You can run ProcessController in a window" 77 " or install it in the Deskbar."), B_TRANSLATE("Run in window"), 78 B_TRANSLATE("Install in Deskbar"), 79 NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); 80 81 if (alert->Go() != 0) { 82 BDeskbar deskbar; 83 if (!deskbar.HasItem(kDeskbarItemName)) 84 move_to_deskbar(deskbar); 85 Quit(); 86 return; 87 } 88 } else { 89 BAlert* alert = new BAlert(B_TRANSLATE("Info"), 90 B_TRANSLATE("ProcessController is already installed in Deskbar."), 91 B_TRANSLATE("OK"), NULL, 92 NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); 93 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 94 alert->Go(); 95 } 96 97 new PCWindow(); 98 99 // quit other eventually running instances 100 BList list; 101 be_roster->GetAppList(kSignature, &list); 102 int32 count = list.CountItems(); 103 if (count > 1) { 104 for (int32 i = 0; i < count - 1; i++) { 105 BMessenger otherme(NULL, (addr_t)list.ItemAt(i)); 106 otherme.SendMessage(B_QUIT_REQUESTED); 107 } 108 } 109} 110 111 112void 113PCApplication::ArgvReceived(int32 argc, char **argv) 114{ 115 if (argc == 2 && strcmp(argv[1], "-desktop-reset") == 0) { 116 team_id tracker = be_roster->TeamFor(kTrackerSig); 117 if (tracker >= 0) { 118 BMessenger messenger(NULL, tracker); 119 messenger.SendMessage(B_QUIT_REQUESTED); 120 int k = 500; 121 do { 122 snooze(10000); 123 } while (be_roster->IsRunning(kTrackerSig) && k-- > 0); 124 } 125 BPath shelfPath; 126 if (find_directory(B_USER_SETTINGS_DIRECTORY, &shelfPath) == B_OK 127 && shelfPath.Append("Tracker/tracker_shelf") == B_OK) { 128 remove(shelfPath.Path()); 129 } 130 BPath trackerPath; 131 if (find_directory(B_SYSTEM_DIRECTORY, &trackerPath) == B_OK 132 && trackerPath.Append("Tracker") == B_OK) { 133 launch(kTrackerSig, trackerPath.Path()); 134 } 135 } else if (argc == 2 && strcmp(argv[1], "-deskbar") == 0) { 136 BDeskbar deskbar; 137 if (!gInDeskbar && !deskbar.HasItem(kDeskbarItemName)) 138 move_to_deskbar(deskbar); 139 } else if (argc > 1) { 140 // print a simple usage string 141 printf(B_TRANSLATE("Usage: %s [-deskbar]\n"), argv[0]); 142 puts(B_TRANSLATE("(c) 1996-2001 Georges-Edouard Berenger, " 143 "berenger@francenet.fr")); 144 } 145 146 Quit(); 147} 148 149 150// #pragma mark - 151 152 153int 154main() 155{ 156 PCApplication application; 157 application.Run(); 158 159 return B_OK; 160} 161 162