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