xref: /haiku/src/apps/processcontroller/PCWorld.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2 	PCWorld.cpp
3 
4 	ProcessController © 2000, Georges-Edouard Berenger, All Rights Reserved.
5 	Copyright (C) 2004 beunited.org
6 
7 	This library is free software; you can redistribute it and/or
8 	modify it under the terms of the GNU Lesser General Public
9 	License as published by the Free Software Foundation; either
10 	version 2.1 of the License, or (at your option) any later version.
11 
12 	This library is distributed in the hope that it will be useful,
13 	but WITHOUT ANY WARRANTY; without even the implied warranty of
14 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 	Lesser General Public License for more details.
16 
17 	You should have received a copy of the GNU Lesser General Public
18 	License along with this library; if not, write to the Free Software
19 	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21 
22 
23 #include "PCWorld.h"
24 #include "PCWindow.h"
25 #include "Preferences.h"
26 #include "ProcessController.h"
27 #include "Utilities.h"
28 
29 #include <Alert.h>
30 #include <Application.h>
31 #include <Catalog.h>
32 #include <Deskbar.h>
33 #include <FindDirectory.h>
34 #include <Path.h>
35 #include <Roster.h>
36 
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 
41 
42 #undef B_TRANSLATION_CONTEXT
43 #define B_TRANSLATION_CONTEXT "ProcessController"
44 
45 
46 class PCApplication : public BApplication {
47 public:
48 								PCApplication();
49 	virtual						~PCApplication();
50 
51 	virtual	void				ReadyToRun();
52 	virtual	void				ArgvReceived(int32 argc, char** argv);
53 };
54 
55 
56 const char* kSignature = "application/x-vnd.Haiku-ProcessController";
57 const char* kTrackerSig = "application/x-vnd.Be-TRAK";
58 const char* kDeskbarSig = "application/x-vnd.Be-TSKB";
59 const char* kTerminalSig = "application/x-vnd.Haiku-Terminal";
60 const char* kPreferencesFileName = "ProcessController Prefs";
61 
62 const char*	kPosPrefName = "Position";
63 const char*	kVersionName = "Version";
64 const int kCurrentVersion = 311;
65 
66 thread_id id = 0;
67 
68 
69 PCApplication::PCApplication()
70 	:
71 	BApplication(kSignature)
72 {
73 }
74 
75 
76 PCApplication::~PCApplication()
77 {
78 	if (id) {
79 		status_t returnValue;
80 		wait_for_thread(id, &returnValue);
81 	}
82 }
83 
84 
85 void
86 PCApplication::ReadyToRun()
87 {
88 	BDeskbar deskbar;
89 	if (!deskbar.HasItem(kDeskbarItemName)) {
90 		// We're not yet installed in the Deskbar, ask if we should
91 		BAlert* alert = new BAlert(B_TRANSLATE("Info"),
92 			B_TRANSLATE("You can run ProcessController in a window"
93 			" or install it in the Deskbar."), B_TRANSLATE("Run in window"),
94 			B_TRANSLATE("Install in Deskbar"),
95 			NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
96 
97 		if (alert->Go() != 0) {
98 			BDeskbar deskbar;
99 			if (!deskbar.HasItem(kDeskbarItemName))
100 				move_to_deskbar(deskbar);
101 			Quit();
102 			return;
103 		}
104 	} else {
105 		BAlert* alert = new BAlert(B_TRANSLATE("Info"),
106 			B_TRANSLATE("ProcessController is already installed in Deskbar."),
107 			B_TRANSLATE("OK"), NULL,
108 			NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
109 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
110 		alert->Go();
111 	}
112 
113 	new PCWindow();
114 
115 	// quit other eventually running instances
116 	BList list;
117 	be_roster->GetAppList(kSignature, &list);
118 	int32 count = list.CountItems();
119 	if (count > 1) {
120 		for (int32 i = 0; i < count - 1; i++) {
121 			BMessenger otherme(NULL, (addr_t)list.ItemAt(i));
122 			BMessage message(B_QUIT_REQUESTED);
123 			otherme.SendMessage(&message);
124 		}
125 	}
126 }
127 
128 
129 void
130 PCApplication::ArgvReceived(int32 argc, char **argv)
131 {
132 	if (argc == 2 && strcmp(argv[1], "-desktop-reset") == 0) {
133 		team_id tracker = be_roster->TeamFor(kTrackerSig);
134 		if (tracker >= 0) {
135 			BMessenger messenger(NULL, tracker);
136 			messenger.SendMessage(B_QUIT_REQUESTED);
137 			int	k = 500;
138 			do {
139 				snooze(10000);
140 			} while (be_roster->IsRunning(kTrackerSig) && k-- > 0);
141 		}
142 		BPath shelfPath;
143 		if (find_directory(B_USER_SETTINGS_DIRECTORY, &shelfPath) == B_OK
144 			&& shelfPath.Append("Tracker/tracker_shelf") == B_OK) {
145 			remove(shelfPath.Path());
146 		}
147 		BPath trackerPath;
148 		if (find_directory(B_SYSTEM_DIRECTORY, &trackerPath) == B_OK
149 			&& trackerPath.Append("Tracker") == B_OK) {
150 			launch(kTrackerSig, trackerPath.Path());
151 		}
152 	} else if (argc == 2 && strcmp(argv[1], "-deskbar") == 0) {
153 		BDeskbar deskbar;
154 		if (!gInDeskbar && !deskbar.HasItem(kDeskbarItemName))
155 			move_to_deskbar(deskbar);
156 	} else if (argc > 1) {
157 		// print a simple usage string
158 		printf(B_TRANSLATE("Usage: %s [-deskbar]\n"), argv[0]);
159 		printf(B_TRANSLATE("(c) 1996-2001 Georges-Edouard Berenger, "
160 		"berenger@francenet.fr\n"));
161 	}
162 
163 	Quit();
164 }
165 
166 
167 //	#pragma mark -
168 
169 
170 int
171 main()
172 {
173 	PCApplication application;
174 	application.Run();
175 
176 	return B_OK;
177 }
178 
179