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