xref: /haiku/src/apps/processcontroller/Utilities.cpp (revision f73f5d4c42a01ece688cbb57b5d332cc0f68b2c6)
1 /*
2 	ProcessController © 2000, Georges-Edouard Berenger, All Rights Reserved.
3 	Copyright (C) 2004 beunited.org
4 
5 	This library is free software; you can redistribute it and/or
6 	modify it under the terms of the GNU Lesser General Public
7 	License as published by the Free Software Foundation; either
8 	version 2.1 of the License, or (at your option) any later version.
9 
10 	This library is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 	Lesser General Public License for more details.
14 
15 	You should have received a copy of the GNU Lesser General Public
16 	License along with this library; if not, write to the Free Software
17 	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19 
20 
21 #include "Utilities.h"
22 #include "PCWorld.h"
23 #include "ProcessController.h"
24 #include "icons.h"
25 
26 #ifdef __HAIKU__
27 	#include <AppMisc.h>
28 #endif
29 #include <Alert.h>
30 #include <Bitmap.h>
31 #include <Deskbar.h>
32 #include <FindDirectory.h>
33 #include <NodeInfo.h>
34 #include <Path.h>
35 #include <Roster.h>
36 #include <Screen.h>
37 #include <Window.h>
38 
39 #include <stdio.h>
40 #include <string.h>
41 
42 
43 bool
44 get_team_name_and_icon(info_pack& infoPack, bool icon)
45 {
46 	BPath systemPath;
47 	find_directory(B_BEOS_SYSTEM_DIRECTORY, &systemPath);
48 
49 	bool nameFromArgs = false;
50 	bool tryTrackerIcon = true;
51 
52 	for (int len = strlen(infoPack.team_info.args) - 1;
53 			len >= 0 && infoPack.team_info.args[len] == ' '; len--) {
54 		infoPack.team_info.args[len] = 0;
55 	}
56 
57 	app_info info;
58 	status_t status = be_roster->GetRunningAppInfo(infoPack.team_info.team, &info);
59 	if (status != B_OK) {
60 		if (infoPack.team_info.team == B_SYSTEM_TEAM) {
61 			// Get icon and name from kernel image
62 			system_info	systemInfo;
63 			get_system_info(&systemInfo);
64 
65 			BPath kernelPath(systemPath);
66 			kernelPath.Append(systemInfo.kernel_name);
67 			get_ref_for_path(kernelPath.Path(), &info.ref);
68 			nameFromArgs = true;
69 		} else {
70 #ifdef __HAIKU__
71 			status = BPrivate::get_app_ref(infoPack.team_info.team, &info.ref);
72 			nameFromArgs = true;
73 #else
74 
75 			BEntry entry(infoPack.team_info.args, true);
76 			status = entry.GetRef(&info.ref);
77 			if (status != B_OK
78 				|| strncmp(infoPack.team_info.args, systemPath.Path(),
79 					strlen(systemPath.Path())) != 0)
80 				nameFromArgs = true;
81 #endif
82 			tryTrackerIcon = (status == B_OK);
83 		}
84 	}
85 
86 	strncpy(infoPack.team_name, nameFromArgs ? infoPack.team_info.args : info.ref.name,
87 		B_PATH_NAME_LENGTH - 1);
88 
89 	if (icon) {
90 #ifdef __HAIKU__
91 		infoPack.team_icon = new BBitmap(BRect(0, 0, 15, 15), B_RGBA32);
92 #else
93 		infoPack.team_icon = new BBitmap(BRect(0, 0, 15, 15), B_CMAP8);
94 #endif
95 		if (!tryTrackerIcon
96 			|| BNodeInfo::GetTrackerIcon(&info.ref, infoPack.team_icon,
97 				B_MINI_ICON) != B_OK) {
98 			BMimeType genericAppType(B_APP_MIME_TYPE);
99 			status = genericAppType.GetIcon(infoPack.team_icon, B_MINI_ICON);
100 		}
101 	} else
102 		infoPack.team_icon = NULL;
103 
104 	return true;
105 }
106 
107 
108 bool
109 launch(const char* signature, const char* path)
110 {
111 	status_t status = be_roster->Launch(signature);
112 	if (status != B_OK && path) {
113 		entry_ref ref;
114 		if (get_ref_for_path(path, &ref) == B_OK)
115 			status = be_roster->Launch(&ref);
116 	}
117 	return status == B_OK;
118 }
119 
120 
121 void
122 mix_colors(rgb_color &target, rgb_color & first, rgb_color & second, float mix)
123 {
124 	target.red = (uint8)(second.red * mix + (1. - mix) * first.red);
125 	target.green = (uint8)(second.green * mix + (1. - mix) * first.green);
126 	target.blue = (uint8)(second.blue * mix + (1. - mix) * first.blue);
127 	target.alpha = (uint8)(second.alpha * mix + (1. - mix) * first.alpha);
128 }
129 
130 
131 void
132 find_self(entry_ref& ref)
133 {
134 	int32 cookie = 0;
135 	image_info info;
136 	while (get_next_image_info (0, &cookie, &info) == B_OK) {
137 		if (((addr_t)info.text <= (addr_t)move_to_deskbar
138 			&& (addr_t)info.text + (size_t)info.text_size > (addr_t)move_to_deskbar)
139 			|| ((addr_t)info.data <= (addr_t)move_to_deskbar
140 			&& (addr_t)info.data + (size_t)info.data_size > (addr_t)move_to_deskbar)) {
141 			if (get_ref_for_path (info.name, &ref) == B_OK)
142 				return;
143 		}
144 	}
145 
146 	// This works, but not always... :(
147 	app_info appInfo;
148 	be_roster->GetAppInfo(kSignature, &appInfo);
149 	ref = appInfo.ref;
150 }
151 
152 
153 void
154 move_to_deskbar(BDeskbar& deskbar)
155 {
156 	entry_ref ref;
157 	find_self(ref);
158 
159 	deskbar.AddItem(&ref);
160 }
161 
162 
163 void
164 make_window_visible(BWindow* window, bool mayResize)
165 {
166 	uint32 flags = window->Flags();
167 	BRect screen = BScreen(window).Frame();
168 	BRect frame = window->Frame();
169 	screen.InsetBy(4, 8);
170 	screen.OffsetBy(0, 8);
171 
172 	if (mayResize) {
173 		float width = frame.Width();
174 		float height = frame.Height();
175 		if (screen.Width() < width && !(flags & B_NOT_H_RESIZABLE))
176 			width = screen.Width();
177 		if (screen.Height() < height && !(flags & B_NOT_V_RESIZABLE))
178 			height = screen.Height();
179 		if (width != frame.Width() || height != frame.Height()) {
180 			window->ResizeTo(width, height);
181 			frame.right = frame.left + width;
182 			frame.bottom = frame.top + height;
183 		}
184 	}
185 	if (frame.right > screen.right)
186 		window->MoveBy(screen.right-frame.right, 0);
187 	if (frame.bottom > screen.bottom)
188 		window->MoveBy(0, screen.bottom-frame.bottom);
189 	if (frame.left < screen.left)
190 		window->MoveTo(screen.left, frame.top);
191 	if (frame.top < screen.top)
192 		window->MoveBy(0, screen.top-frame.top);
193 }
194 
195