VirtualBox

source: vbox/trunk/src/VBox/Additions/haiku/VBoxTray/VBoxGuestDeskbarView.cpp@ 76690

Last change on this file since 76690 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1/* $Id: VBoxGuestDeskbarView.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * VBoxGuestDeskbarView, Haiku Guest Additions, implementation.
4 */
5
6/*
7 * Copyright (C) 2012-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*
19 * This code is based on:
20 *
21 * VirtualBox Guest Additions for Haiku.
22 * Copyright (c) 2011 Mike Smith <[email protected]>
23 * François Revol <[email protected]>
24 *
25 * Permission is hereby granted, free of charge, to any person
26 * obtaining a copy of this software and associated documentation
27 * files (the "Software"), to deal in the Software without
28 * restriction, including without limitation the rights to use,
29 * copy, modify, merge, publish, distribute, sublicense, and/or sell
30 * copies of the Software, and to permit persons to whom the
31 * Software is furnished to do so, subject to the following
32 * conditions:
33 *
34 * The above copyright notice and this permission notice shall be
35 * included in all copies or substantial portions of the Software.
36 *
37 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
38 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
39 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
40 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
41 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
42 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
43 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
44 * OTHER DEALINGS IN THE SOFTWARE.
45 */
46
47
48/*********************************************************************************************************************************
49* Header Files *
50*********************************************************************************************************************************/
51#include <errno.h>
52#include <Alert.h>
53#include <Roster.h>
54#include <Debug.h>
55#include <Deskbar.h>
56#include <File.h>
57#include <MenuItem.h>
58#include <Path.h>
59#include <PopUpMenu.h>
60#include <Resources.h>
61#include <String.h>
62#include <TranslationUtils.h>
63
64#include "VBoxGuestDeskbarView.h"
65#include "VBoxGuestApplication.h"
66
67#define VIEWNAME "VBoxGuestDeskbarView"
68
69static status_t
70our_image(image_info& image)
71{
72 /** @todo r=ramshankar: find a way to do this without annoying the compiler, probably uintptr_t? */
73 int32 cookie = 0;
74 while (get_next_image_info(B_CURRENT_TEAM, &cookie, &image) == B_OK)
75 {
76 if ((char *)our_image >= (char *)image.text
77 && (char *)our_image <= (char *)image.text + image.text_size)
78 return B_OK;
79 }
80
81 return B_ERROR;
82}
83
84
85VBoxGuestDeskbarView::VBoxGuestDeskbarView()
86 : BView(BRect(0, 0, 15, 15), VIEWNAME, B_FOLLOW_NONE,
87 B_WILL_DRAW | B_NAVIGABLE),
88 fIcon(NULL), fClipboardService(NULL), fDisplayService(NULL)
89{
90 _Init();
91}
92
93
94VBoxGuestDeskbarView::VBoxGuestDeskbarView(BMessage *archive)
95 : BView(archive),
96 fIcon(NULL)
97{
98 archive->PrintToStream();
99 _Init(archive);
100}
101
102
103VBoxGuestDeskbarView::~VBoxGuestDeskbarView()
104{
105 delete fIcon;
106 if (fClipboardService)
107 {
108 fClipboardService->Disconnect();
109 delete fClipboardService;
110 }
111 VbglR3Term();
112}
113
114
115BArchivable* VBoxGuestDeskbarView::Instantiate(BMessage *data)
116{
117 if (!validate_instantiation(data, VIEWNAME))
118 return NULL;
119
120 return new VBoxGuestDeskbarView(data);
121}
122
123
124status_t VBoxGuestDeskbarView::Archive(BMessage *data, bool deep) const
125{
126 status_t err;
127
128 err = BView::Archive(data, false);
129 if (err < B_OK)
130 {
131 LogRel(("VBoxGuestDeskbarView::Archive failed.rc=%08lx\n", err));
132 return err;
133 }
134 data->AddString("add_on", VBOX_GUEST_APP_SIG);
135 data->AddString("class", "VBoxGuestDeskbarView");
136 return B_OK;
137}
138
139
140void VBoxGuestDeskbarView::Draw(BRect rect)
141{
142 SetDrawingMode(B_OP_ALPHA);
143 DrawBitmap(fIcon);
144}
145
146
147void VBoxGuestDeskbarView::AttachedToWindow()
148{
149 BView::AttachedToWindow();
150 if (Parent())
151 {
152 SetViewColor(Parent()->ViewColor());
153 SetLowColor(Parent()->LowColor());
154 }
155
156 if (fClipboardService) /* Don't repeatedly crash deskbar if vboxdev not loaded */
157 {
158 Looper()->AddHandler(fClipboardService);
159 fClipboardService->Connect();
160 }
161
162 if (fDisplayService)
163 fDisplayService->Start();
164}
165
166
167void VBoxGuestDeskbarView::DetachedFromWindow()
168{
169 BMessage message(B_QUIT_REQUESTED);
170 fClipboardService->MessageReceived(&message);
171 fDisplayService->MessageReceived(&message);
172}
173
174
175void VBoxGuestDeskbarView::MouseDown(BPoint point)
176{
177 int32 buttons = B_PRIMARY_MOUSE_BUTTON;
178 if (Looper() != NULL && Looper()->CurrentMessage() != NULL)
179 Looper()->CurrentMessage()->FindInt32("buttons", &buttons);
180
181 BPoint where = ConvertToScreen(point);
182
183 if ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0)
184 {
185 BPopUpMenu *menu = new BPopUpMenu(B_EMPTY_STRING, false, false);
186 menu->SetAsyncAutoDestruct(true);
187 menu->SetFont(be_plain_font);
188
189 menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED)));
190 menu->SetTargetForItems(this);
191
192 menu->Go(where, true, true, true);
193 }
194}
195
196
197void VBoxGuestDeskbarView::MessageReceived(BMessage *message)
198{
199 if (message->what == B_QUIT_REQUESTED)
200 RemoveFromDeskbar();
201 else
202 BHandler::MessageReceived(message);
203}
204
205
206status_t VBoxGuestDeskbarView::AddToDeskbar(bool force)
207{
208 BDeskbar deskbar;
209 status_t err;
210
211 if (force)
212 RemoveFromDeskbar();
213 else if (deskbar.HasItem(VIEWNAME))
214 return B_OK;
215
216 app_info info;
217 err = be_app->GetAppInfo(&info);
218 if (err < B_OK)
219 return err;
220
221 BPath p(&info.ref);
222 return deskbar.AddItem(&info.ref);
223}
224
225
226status_t VBoxGuestDeskbarView::RemoveFromDeskbar()
227{
228 BDeskbar deskbar;
229 return deskbar.RemoveItem(VIEWNAME);
230}
231
232
233status_t VBoxGuestDeskbarView::_Init(BMessage *archive)
234{
235 BString toolTipText;
236 toolTipText << VBOX_PRODUCT << " Guest Additions ";
237 toolTipText << VBOX_VERSION_MAJOR << "." << VBOX_VERSION_MINOR << "." << VBOX_VERSION_BUILD;
238 toolTipText << "r" << VBOX_SVN_REV;
239
240 SetToolTip(toolTipText.String());
241
242 image_info info;
243 if (our_image(info) != B_OK)
244 return B_ERROR;
245
246 BFile file(info.name, B_READ_ONLY);
247 if (file.InitCheck() < B_OK)
248 return B_ERROR;
249
250 BResources resources(&file);
251 if (resources.InitCheck() < B_OK)
252 return B_ERROR;
253
254 const void *data = NULL;
255 size_t size;
256 //data = resources.LoadResource(B_VECTOR_ICON_TYPE,
257 // kNetworkStatusNoDevice + i, &size);
258 data = resources.LoadResource('data', 400, &size);
259 if (data != NULL)
260 {
261 BMemoryIO mem(data, size);
262 fIcon = BTranslationUtils::GetBitmap(&mem);
263 }
264
265 int rc = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE);
266 if (RT_SUCCESS(rc))
267 {
268 rc = VbglR3Init();
269 if (RT_SUCCESS(rc))
270 {
271 fClipboardService = new VBoxClipboardService();
272 fDisplayService = new VBoxDisplayService();
273 }
274 else
275 LogRel(("VBoxGuestDeskbarView::_init VbglR3Init failed. rc=%d\n", rc));
276 }
277 else
278 LogRel(("VBoxGuestDeskbarView::_init RTR3InitDll failed. rc=%d\n", rc));
279 return RTErrConvertToErrno(rc);
280}
281
282
283RTDECL(BView*) instantiate_deskbar_item()
284{
285 return new VBoxGuestDeskbarView();
286}
287
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette