Ticket #732: patch_fonts

File patch_fonts, 22.6 KB (added by stpere, 16 years ago)
Line 
1Index: src/servers/app/ServerApp.h
2===================================================================
3--- src/servers/app/ServerApp.h (révision 30247)
4+++ src/servers/app/ServerApp.h (copie de travail)
5@@ -8,11 +8,13 @@
6 * Stephan Aßmus <superstippi@gmx.de>
7 * Stefano Ceccherini (burton666@libero.it)
8 * Axel Dörfler, axeld@pinc-software.de
9+ * Philippe Saint-Pierre, stpere@gmail.com
10 */
11 #ifndef SERVER_APP_H
12 #define SERVER_APP_H
13
14
15+#include "ServerFont.h"
16 #include "ClientMemoryAllocator.h"
17 #include "MessageLooper.h"
18
19@@ -84,6 +86,8 @@
20
21 Desktop* GetDesktop() const { return fDesktop; }
22
23+ status_t GetFont(char *which, ServerFont& font);
24+
25 BPrivate::BTokenSpace& ViewTokens() { return fViewTokens; }
26
27 private:
28@@ -111,6 +115,10 @@
29 BString fSignature;
30 team_id fClientTeam;
31
32+ ServerFont fPlainFont;
33+ ServerFont fBoldFont;
34+ ServerFont fFixedFont;
35+
36 mutable BLocker fWindowListLock;
37 BObjectList<ServerWindow> fWindowList;
38 BPrivate::BTokenSpace fViewTokens;
39Index: src/servers/app/DecorManager.cpp
40===================================================================
41--- src/servers/app/DecorManager.cpp (révision 30247)
42+++ src/servers/app/DecorManager.cpp (copie de travail)
43@@ -2,7 +2,8 @@
44 * Copyright (c) 2001-2005, Haiku, Inc.
45 * Distributed under the terms of the MIT license.
46 *
47- * Author: DarkWyrm <bpmagic@columbus.rr.com>
48+ * Author: DarkWyrm <bpmagic@columbus.rr.com>
49+ * Philippe Saint-Pierre, stpere@gmail.com
50 */
51
52
53@@ -16,13 +17,13 @@
54 #include "AppServer.h"
55 #include "DefaultDecorator.h"
56 #include "Desktop.h"
57-#include "DesktopSettings.h"
58+#include "ServerApp.h"
59 #include "ServerConfig.h"
60 #include "DecorManager.h"
61
62 typedef float get_version(void);
63-typedef Decorator* create_decorator(DesktopSettings& desktopSettings, BRect rect,
64- window_look look, uint32 flags);
65+typedef Decorator* create_decorator(BRect rect,
66+ window_look look, uint32 flags, ServerApp *app);
67
68 // Globals
69 DecorManager gDecorManager;
70@@ -42,7 +43,7 @@
71
72 Decorator* Instantiate(Desktop* desktop, DrawingEngine* engine,
73 BRect rect, const char* title,
74- window_look look, uint32 flags);
75+ window_look look, uint32 flags, ServerApp *app);
76
77 private:
78 image_id fID;
79@@ -76,19 +77,18 @@
80
81 Decorator *
82 DecorInfo::Instantiate(Desktop* desktop, DrawingEngine* engine, BRect rect,
83- const char *title, window_look look, uint32 flags)
84+ const char *title, window_look look, uint32 flags, ServerApp* app)
85 {
86 if (!desktop->LockSingleWindow())
87 return NULL;
88
89- DesktopSettings settings(desktop);
90 Decorator *decorator;
91
92 try {
93 if (fAllocator != NULL)
94- decorator = fAllocator(settings, rect, look, flags);
95+ decorator = fAllocator(rect, look, flags, app);
96 else
97- decorator = new DefaultDecorator(settings, rect, look, flags);
98+ decorator = new DefaultDecorator(rect, look, flags, app);
99 } catch (...) {
100 desktop->UnlockSingleWindow();
101 return NULL;
102@@ -197,7 +197,7 @@
103
104 Decorator *
105 DecorManager::AllocateDecorator(Desktop* desktop, DrawingEngine* engine,
106- BRect rect, const char* title, window_look look, uint32 flags)
107+ BRect rect, const char* title, window_look look, uint32 flags, ServerApp *app)
108 {
109 // Create a new instance of the current decorator.
110 // Ownership is that of the caller
111@@ -209,7 +209,7 @@
112 }
113
114 return fCurrentDecor->Instantiate(desktop, engine, rect, title,
115- look, flags);
116+ look, flags, app);
117 }
118
119
120Index: src/servers/app/ServerApp.cpp
121===================================================================
122--- src/servers/app/ServerApp.cpp (révision 30247)
123+++ src/servers/app/ServerApp.cpp (copie de travail)
124@@ -10,6 +10,7 @@
125 * Axel Dörfler, axeld@pinc-software.de
126 * Jérôme Duval, jerome.duval@free.fr
127 * Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
128+ * Philippe Saint-Pierre, stpere@gmail.com
129 */
130
131 /*!
132@@ -123,6 +124,14 @@
133 fInitialWorkspace = desktop->CurrentWorkspace();
134 // TODO: this should probably be retrieved when the app is loaded!
135
136+ // record the current system wide fonts..
137+ desktop->LockSingleWindow();
138+ DesktopSettings settings(desktop);
139+ settings.GetDefaultPlainFont(fPlainFont);
140+ settings.GetDefaultBoldFont(fBoldFont);
141+ settings.GetDefaultFixedFont(fFixedFont);
142+ desktop->UnlockSingleWindow();
143+
144 STRACE(("ServerApp %s:\n", Signature()));
145 STRACE(("\tBApp port: %ld\n", fClientReplyPort));
146 STRACE(("\tReceiver port: %ld\n", fMessagePort));
147@@ -390,6 +399,36 @@
148 }
149
150
151+// Helper function to attach the fonts attribute to a link
152+// Could be made a method of the link itself, I suppose
153+
154+void
155+_AttachFont(BPrivate::PortLink& fLink, ServerFont& font)
156+{
157+ fLink.Attach<uint16>(font.FamilyID());
158+ fLink.Attach<uint16>(font.StyleID());
159+ fLink.Attach<float>(font.Size());
160+ fLink.Attach<uint16>(font.Face());
161+ fLink.Attach<uint32>(font.Flags());
162+}
163+
164+
165+status_t
166+ServerApp::GetFont(char *which, ServerFont& font)
167+{
168+ if (!strcmp(which, "plain")) {
169+ font = fPlainFont;
170+ } else if (!strcmp(which, "bold")) {
171+ font = fBoldFont;
172+ } else if (!strcmp(which, "fixed")) {
173+ font = fFixedFont;
174+ } else
175+ return B_BAD_VALUE;
176+
177+ return B_OK;
178+}
179+
180+
181 /*!
182 \brief Handler function for BApplication API messages
183 \param code Identifier code for the message. Equivalent to BMessage::what
184@@ -1123,8 +1162,44 @@
185
186 /* font messages */
187
188+ case AS_GET_SYSTEM_FONT:
189+ {
190+ FTRACE(("ServerApp %s: AS_GET_SYSTEM_FONT\n", Signature()));
191+ // gets :
192+ // 1) string - font type ("plain", ...)
193+
194+ char type[B_OS_NAME_LENGTH];
195+ ServerFont font;
196+
197+ status_t status = link.ReadString(type, sizeof(type));
198+
199+ if (status == B_OK) {
200+ if (!strcmp(type, "plain")) {
201+ fLink.StartMessage(B_OK);
202+ _AttachFont(fLink, fPlainFont);
203+ } else if (!strcmp(type, "bold")) {
204+ fLink.StartMessage(B_OK);
205+ _AttachFont(fLink, fBoldFont);
206+ } else if (!strcmp(type, "fixed")) {
207+ fLink.StartMessage(B_OK);
208+ _AttachFont(fLink, fFixedFont);
209+ } else {
210+ FTRACE(("Font name not found : %s\n", type));
211+ status = B_BAD_VALUE;
212+ }
213+ }
214+
215+ if (status != B_OK) {
216+ fLink.StartMessage(status);
217+ }
218+
219+ fLink.Flush();
220+ break;
221+ }
222+
223 case AS_SET_SYSTEM_FONT:
224 {
225+ FTRACE(("ServerApp %s: AS_SET_SYSTEM_FONT\n", Signature()));
226 // gets:
227 // 1) string - font type ("plain", ...)
228 // 2) string - family
229@@ -1209,40 +1284,17 @@
230 // 4) uint16 - face flags
231 // 5) uint32 - font flags
232
233- if (!fDesktop->LockSingleWindow()) {
234- fLink.StartMessage(B_OK);
235- fLink.Flush();
236- break;
237- }
238-
239- DesktopSettings settings(fDesktop);
240 fLink.StartMessage(B_OK);
241
242- for (int32 i = 0; i < 3; i++) {
243- ServerFont font;
244- switch (i) {
245- case 0:
246- settings.GetDefaultPlainFont(font);
247- fLink.AttachString("plain");
248- break;
249- case 1:
250- settings.GetDefaultBoldFont(font);
251- fLink.AttachString("bold");
252- break;
253- case 2:
254- settings.GetDefaultFixedFont(font);
255- fLink.AttachString("fixed");
256- break;
257- }
258+ fLink.AttachString("plain");
259+ _AttachFont(fLink, fPlainFont);
260
261- fLink.Attach<uint16>(font.FamilyID());
262- fLink.Attach<uint16>(font.StyleID());
263- fLink.Attach<float>(font.Size());
264- fLink.Attach<uint16>(font.Face());
265- fLink.Attach<uint32>(font.Flags());
266- }
267+ fLink.AttachString("bold");
268+ _AttachFont(fLink, fBoldFont);
269
270- fDesktop->UnlockSingleWindow();
271+ fLink.AttachString("fixed");
272+ _AttachFont(fLink, fFixedFont);
273+
274 fLink.Flush();
275 break;
276 }
277Index: src/servers/app/Decorator.cpp
278===================================================================
279--- src/servers/app/Decorator.cpp (révision 30247)
280+++ src/servers/app/Decorator.cpp (copie de travail)
281@@ -28,9 +28,10 @@
282 \param wfeel style of window feel. See Window.h
283 \param wflags various window flags. See Window.h
284 */
285-Decorator::Decorator(DesktopSettings& settings, BRect rect, window_look look,
286- uint32 flags)
287+Decorator::Decorator(BRect rect, window_look look,
288+ uint32 flags, ServerApp *app)
289 :
290+ fServerApp(app),
291 fDrawingEngine(NULL),
292 fDrawState(),
293
294@@ -103,7 +104,7 @@
295 /*! \brief Called whenever the system fonts are changed.
296 */
297 void
298-Decorator::FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
299+Decorator::FontsChanged(BRegion* updateRegion)
300 {
301 }
302
303@@ -112,7 +113,7 @@
304 \param look New value for the look
305 */
306 void
307-Decorator::SetLook(DesktopSettings& settings, window_look look,
308+Decorator::SetLook(window_look look,
309 BRegion* updateRect)
310 {
311 fLook = look;
312Index: src/servers/app/DefaultDecorator.h
313===================================================================
314--- src/servers/app/DefaultDecorator.h (révision 30247)
315+++ src/servers/app/DefaultDecorator.h (copie de travail)
316@@ -18,18 +18,15 @@
317
318 class DefaultDecorator: public Decorator {
319 public:
320- DefaultDecorator(DesktopSettings& settings,
321- BRect frame, window_look look,
322- uint32 flags);
323+ DefaultDecorator(BRect frame, window_look look,
324+ uint32 flags, ServerApp *app);
325 virtual ~DefaultDecorator();
326
327 virtual void SetTitle(const char* string,
328 BRegion* updateRegion = NULL);
329- virtual void FontsChanged(DesktopSettings& settings,
330- BRegion* updateRegion);
331- virtual void SetLook(DesktopSettings& settings,
332- window_look look,
333- BRegion* updateRegion = NULL);
334+ virtual void FontsChanged(BRegion* updateRegion);
335+ virtual void SetLook(window_look look,
336+ BRegion* updateRegion = NULL);
337 virtual void SetFlags(uint32 flags,
338 BRegion* updateRegion = NULL);
339
340@@ -70,7 +67,7 @@
341 virtual void _SetColors();
342
343 private:
344- void _UpdateFont(DesktopSettings& settings);
345+ void _UpdateFont();
346 void _DrawButtonBitmap(ServerBitmap* bitmap,
347 BRect rect);
348 void _DrawBlendedRect(DrawingEngine *engine,
349Index: src/servers/app/ServerWindow.cpp
350===================================================================
351--- src/servers/app/ServerWindow.cpp (révision 30247)
352+++ src/servers/app/ServerWindow.cpp (copie de travail)
353@@ -9,6 +9,7 @@
354 * Stefano Ceccherini (burton666@libero.it)
355 * Axel Dörfler, axeld@pinc-software.de
356 * Artur Wyszynski <harakash@gmail.com>
357+ * Philippe Saint-Pierre, stpere@gmail.com
358 */
359
360 /*!
361@@ -618,11 +619,12 @@
362 // fDesktop->LockSingleWindow();
363 }
364
365- // TODO: default fonts should be created and stored in the Application
366- DesktopSettings settings(fDesktop);
367 ServerFont font;
368- settings.GetDefaultPlainFont(font);
369- newView->CurrentState()->SetFont(font);
370+ if (App()->GetFont("plain", font) == B_OK) {
371+ newView->CurrentState()->SetFont(font);
372+ } else {
373+ debug_printf("Plain font not found!\n");
374+ }
375
376 if (_parent) {
377 View *parent;
378Index: src/servers/app/Window.cpp
379===================================================================
380--- src/servers/app/Window.cpp (révision 30247)
381+++ src/servers/app/Window.cpp (copie de travail)
382@@ -7,6 +7,7 @@
383 * Adi Oanca <adioanca@gmail.com>
384 * Stephan Aßmus <superstippi@gmx.de>
385 * Axel Dörfler, axeld@pinc-software.de
386+ * Philippe Saint-Pierre, stpere@gmail.com
387 */
388
389
390@@ -144,7 +145,7 @@
391
392 if (fLook != B_NO_BORDER_WINDOW_LOOK) {
393 fDecorator = gDecorManager.AllocateDecorator(fDesktop, fDrawingEngine,
394- frame, name, fLook, fFlags);
395+ frame, name, fLook, fFlags, ServerWindow()->App());
396 if (fDecorator) {
397 fDecorator->GetSizeLimits(&fMinWidth, &fMinHeight,
398 &fMaxWidth, &fMaxHeight);
399@@ -887,7 +888,6 @@
400 // clicking a simple View
401 if (!IsFocus()) {
402 DesktopSettings desktopSettings(fDesktop);
403-
404 // Activate window in case it doesn't accept first click, and
405 // we're not in FFM mode
406 if ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) == 0
407@@ -1329,8 +1329,7 @@
408 Window::FontsChanged(BRegion* updateRegion)
409 {
410 if (fDecorator != NULL) {
411- DesktopSettings settings(fDesktop);
412- fDecorator->FontsChanged(settings, updateRegion);
413+ fDecorator->FontsChanged(updateRegion);
414 fBorderRegionValid = false;
415 }
416 }
417@@ -1342,7 +1341,7 @@
418 if (fDecorator == NULL && look != B_NO_BORDER_WINDOW_LOOK) {
419 // we need a new decorator
420 fDecorator = gDecorManager.AllocateDecorator(fDesktop, fDrawingEngine,
421- Frame(), Title(), fLook, fFlags);
422+ Frame(), Title(), fLook, fFlags, ServerWindow()->App());
423 if (IsFocus())
424 fDecorator->SetFocus(true);
425 }
426@@ -1358,8 +1357,7 @@
427 // likely not valid anymore either
428
429 if (fDecorator != NULL) {
430- DesktopSettings settings(fDesktop);
431- fDecorator->SetLook(settings, look, updateRegion);
432+ fDecorator->SetLook(look, updateRegion);
433
434 // we might need to resize the window!
435 fDecorator->GetSizeLimits(&fMinWidth, &fMinHeight, &fMaxWidth, &fMaxHeight);
436Index: src/servers/app/Decorator.h
437===================================================================
438--- src/servers/app/Decorator.h (révision 30247)
439+++ src/servers/app/Decorator.h (copie de travail)
440@@ -16,8 +16,8 @@
441 #include <Window.h>
442
443 #include "DrawState.h"
444+#include "ServerApp.h"
445
446-class DesktopSettings;
447 class DrawingEngine;
448 class ServerFont;
449 class BRegion;
450@@ -46,18 +46,17 @@
451
452 class Decorator {
453 public:
454- Decorator(DesktopSettings& settings, BRect rect,
455- window_look look, uint32 flags);
456+ Decorator(BRect rect, window_look look, uint32 flags,
457+ ServerApp *app);
458 virtual ~Decorator();
459
460 void SetDrawingEngine(DrawingEngine *driver);
461 inline DrawingEngine* GetDrawingEngine() const
462 { return fDrawingEngine; }
463
464- virtual void FontsChanged(DesktopSettings& settings,
465- BRegion* updateRegion = NULL);
466- virtual void SetLook(DesktopSettings& settings, window_look look,
467- BRegion* updateRegion = NULL);
468+ virtual void FontsChanged(BRegion* updateRegion = NULL);
469+ virtual void SetLook(window_look look,
470+ BRegion* updateRegion = NULL);
471 virtual void SetFlags(uint32 flags,
472 BRegion* updateRegion = NULL);
473
474@@ -137,6 +136,8 @@
475
476 virtual void _SetFocus();
477
478+ ServerApp* fServerApp;
479+
480 DrawingEngine* fDrawingEngine;
481 DrawState fDrawState;
482
483@@ -144,6 +145,7 @@
484 uint32 fFlags;
485
486 BRect fZoomRect;
487+
488 BRect fCloseRect;
489 BRect fMinimizeRect;
490 BRect fTabRect;
491Index: src/servers/app/DefaultDecorator.cpp
492===================================================================
493--- src/servers/app/DefaultDecorator.cpp (révision 30247)
494+++ src/servers/app/DefaultDecorator.cpp (copie de travail)
495@@ -13,7 +13,6 @@
496 #include "DefaultDecorator.h"
497
498 #include "BitmapDrawingEngine.h"
499-#include "DesktopSettings.h"
500 #include "DrawingEngine.h"
501 #include "DrawState.h"
502 #include "FontManager.h"
503@@ -55,17 +54,14 @@
504 // #pragma mark -
505
506
507-// TODO: get rid of DesktopSettings here, and introduce private accessor
508-// methods to the Decorator base class
509-
510-DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect,
511- window_look look, uint32 flags)
512- : Decorator(settings, rect, look, flags),
513+DefaultDecorator::DefaultDecorator(BRect rect,
514+ window_look look, uint32 flags, ServerApp *app)
515+ : Decorator(rect, look, flags, app),
516 fTabOffset(0),
517 fTabLocation(0.0),
518 fLastClicked(0)
519 {
520- _UpdateFont(settings);
521+ _UpdateFont();
522
523 // common colors to both focus and non focus state
524 fFrameColors[0] = (rgb_color){ 152, 152, 152, 255 };
525@@ -137,7 +133,7 @@
526
527
528 void
529-DefaultDecorator::FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
530+DefaultDecorator::FontsChanged(BRegion* updateRegion)
531 {
532 // get previous extent
533 if (updateRegion != NULL) {
534@@ -146,7 +142,7 @@
535 updateRegion->Include(&extent);
536 }
537
538- _UpdateFont(settings);
539+ _UpdateFont();
540 _DoLayout();
541
542 if (updateRegion != NULL) {
543@@ -158,8 +154,7 @@
544
545
546 void
547-DefaultDecorator::SetLook(DesktopSettings& settings, window_look look,
548- BRegion* updateRegion)
549+DefaultDecorator::SetLook(window_look look, BRegion* updateRegion)
550 {
551 // TODO: we could be much smarter about the update region
552
553@@ -172,7 +167,7 @@
554
555 fLook = look;
556
557- _UpdateFont(settings);
558+ _UpdateFont();
559 _DoLayout();
560
561 if (updateRegion != NULL) {
562@@ -1120,15 +1115,17 @@
563
564
565 void
566-DefaultDecorator::_UpdateFont(DesktopSettings& settings)
567+DefaultDecorator::_UpdateFont()
568 {
569 ServerFont font;
570+
571 if (fLook == B_FLOATING_WINDOW_LOOK || fLook == kLeftTitledWindowLook) {
572- settings.GetDefaultPlainFont(font);
573+ fServerApp->GetFont("plain", font);
574 if (fLook == kLeftTitledWindowLook)
575 font.SetRotation(90.0f);
576+ fDrawState.SetFont(font);
577 } else
578- settings.GetDefaultBoldFont(font);
579+ fServerApp->GetFont("bold", font);
580
581 font.SetFlags(B_FORCE_ANTIALIASING);
582 font.SetSpacing(B_STRING_SPACING);
583Index: src/servers/app/DecorManager.h
584===================================================================
585--- src/servers/app/DecorManager.h (révision 30247)
586+++ src/servers/app/DecorManager.h (copie de travail)
587@@ -30,7 +30,7 @@
588 DrawingEngine* engine,
589 BRect rect,
590 const char* title, window_look look,
591- uint32 flags);
592+ uint32 flags, ServerApp *app);
593
594 int32 CountDecorators() const;
595
596Index: src/kits/app/Application.cpp
597===================================================================
598--- src/kits/app/Application.cpp (révision 30247)
599+++ src/kits/app/Application.cpp (copie de travail)
600@@ -31,6 +31,7 @@
601 #include <Resources.h>
602 #include <Roster.h>
603 #include <Window.h>
604+#include <Font.h>
605
606 #include <AppMisc.h>
607 #include <AppServerLink.h>
608@@ -250,6 +251,11 @@
609
610 // uninitialize be_app, the be_app_messenger is invalidated automatically
611 be_app = NULL;
612+
613+ // free the fonts symbols (they are application specific)
614+ delete be_plain_font;
615+ delete be_bold_font;
616+ delete be_fixed_font;
617 }
618
619
620@@ -433,8 +439,12 @@
621
622 #ifndef RUN_WITHOUT_APP_SERVER
623 // app server connection and IK initialization
624- if (initGUI)
625+ if (initGUI) {
626 fInitError = _InitGUIContext();
627+ be_plain_font = new BFont("plain");
628+ be_bold_font = new BFont("bold");
629+ be_fixed_font = new BFont("fixed");
630+ }
631 #endif // RUN_WITHOUT_APP_SERVER
632 }
633
634Index: src/kits/interface/InterfaceDefs.cpp
635===================================================================
636--- src/kits/interface/InterfaceDefs.cpp (révision 30247)
637+++ src/kits/interface/InterfaceDefs.cpp (copie de travail)
638@@ -938,7 +938,6 @@
639
640 BPrivate::gWidthBuffer = new BPrivate::WidthBuffer;
641
642- _init_global_fonts_();
643
644 _menu_info_ptr_ = &BMenu::sMenuInfo;
645
646Index: src/kits/interface/Font.cpp
647===================================================================
648--- src/kits/interface/Font.cpp (révision 30247)
649+++ src/kits/interface/Font.cpp (copie de travail)
650@@ -12,6 +12,7 @@
651
652
653 #include <AppServerLink.h>
654+#include <Application.h>
655 #include <FontPrivate.h>
656 #include <ObjectList.h>
657 #include <ServerProtocol.h>
658@@ -36,16 +37,12 @@
659 const float kUninitializedAscent = INFINITY;
660 const uint32 kUninitializedExtraFlags = 0xffffffff;
661
662-// The actual objects which the globals point to
663-static BFont sPlainFont;
664-static BFont sBoldFont;
665-static BFont sFixedFont;
666+// Font symbols - these are specific to every application
667+// they will be initialized at application launch...
668+const BFont *be_plain_font = NULL;
669+const BFont *be_bold_font = NULL;
670+const BFont *be_fixed_font = NULL;
671
672-const BFont *be_plain_font = &sPlainFont;
673-const BFont *be_bold_font = &sBoldFont;
674-const BFont *be_fixed_font = &sFixedFont;
675-
676-
677 struct style {
678 BString name;
679 uint16 face;
680@@ -307,53 +304,17 @@
681 // #pragma mark -
682
683
684-void
685-_init_global_fonts_()
686+void _font_control_(BFont *font, int32 cmd, void *data)
687 {
688- BPrivate::AppServerLink link;
689- link.StartMessage(AS_GET_SYSTEM_FONTS);
690-
691- int32 code;
692- if (link.FlushWithReply(code) != B_OK
693- || code != B_OK) {
694- printf("DEBUG: Couldn't initialize global fonts!\n");
695- return;
696- }
697-
698- char type[B_OS_NAME_LENGTH];
699-
700- while (link.ReadString(type, sizeof(type)) >= B_OK && type[0]) {
701- BFont dummy;
702- BFont *font = &dummy;
703-
704- if (!strcmp(type, "plain"))
705- font = &sPlainFont;
706- else if (!strcmp(type, "bold"))
707- font = &sBoldFont;
708- else if (!strcmp(type, "fixed"))
709- font = &sFixedFont;
710-
711- link.Read<uint16>(&font->fFamilyID);
712- link.Read<uint16>(&font->fStyleID);
713- link.Read<float>(&font->fSize);
714- link.Read<uint16>(&font->fFace);
715- link.Read<uint32>(&font->fFlags);
716-
717- font->fHeight.ascent = kUninitializedAscent;
718- font->fExtraFlags = kUninitializedExtraFlags;
719- }
720 }
721
722
723-void _font_control_(BFont *font, int32 cmd, void *data)
724-{
725-}
726-
727 status_t get_font_cache_info(uint32 id, void *set)
728 {
729 return B_ERROR;
730 }
731
732+
733 status_t set_font_cache_info(uint32 id, void *set)
734 {
735 return B_ERROR;
736@@ -503,7 +464,6 @@
737
738 BFont::BFont()
739 :
740- // initialise for be_plain_font (avoid circular definition)
741 fFamilyID(0),
742 fStyleID(0),
743 fSize(10.0),
744@@ -516,7 +476,7 @@
745 fFlags(0),
746 fExtraFlags(kUninitializedExtraFlags)
747 {
748- if (be_plain_font != NULL && this != &sPlainFont)
749+ if (be_plain_font != NULL)
750 *this = *be_plain_font;
751 else {
752 fHeight.ascent = 7.0;
753@@ -526,6 +486,52 @@
754 }
755
756
757+BFont::BFont(const char *which)
758+ :
759+ fFamilyID(0),
760+ fStyleID(0),
761+ fSize(10.0),
762+ fShear(90.0),
763+ fRotation(0.0),
764+ fFalseBoldWidth(0.0),
765+ fSpacing(0),
766+ fEncoding(0),
767+ fFace(0),
768+ fFlags(0),
769+ fExtraFlags(kUninitializedExtraFlags)
770+{
771+ if (be_app
772+ && (!strcmp(which, "plain")
773+ || !strcmp(which, "bold")
774+ || !strcmp(which, "fixed"))) {
775+
776+ BPrivate::AppServerLink link;
777+
778+ link.StartMessage(AS_GET_SYSTEM_FONT);
779+ link.AttachString(which, B_OS_NAME_LENGTH);
780+
781+ int32 code;
782+ link.FlushWithReply(code);
783+
784+ if (code == B_OK) {
785+ link.Read<uint16>(&fFamilyID);
786+ link.Read<uint16>(&fStyleID);
787+ link.Read<float>(&fSize);
788+ link.Read<uint16>(&fFace);
789+ link.Read<uint32>(&fFlags);
790+
791+ fHeight.ascent = kUninitializedAscent;
792+ fExtraFlags = kUninitializedExtraFlags;
793+ return;
794+ }
795+ }
796+ // else...
797+ fHeight.ascent = 7.0;
798+ fHeight.descent = 2.0;
799+ fHeight.leading = 13.0;
800+}
801+
802+
803 BFont::BFont(const BFont &font)
804 {
805 *this = font;
806@@ -536,8 +542,10 @@
807 {
808 if (font)
809 *this = *font;
810+ else if (be_plain_font)
811+ *this = *be_plain_font;
812 else
813- *this = *be_plain_font;
814+ *this = BFont("plain");
815 }
816
817
818Index: headers/os/interface/Font.h
819===================================================================
820--- headers/os/interface/Font.h (révision 30247)
821+++ headers/os/interface/Font.h (copie de travail)
822@@ -148,6 +148,7 @@
823 class BFont {
824 public:
825 BFont();
826+ BFont(const char *which);
827 BFont(const BFont &font);
828 BFont(const BFont *font);
829
830@@ -240,8 +241,6 @@
831 void PrintToStream() const;
832
833 private:
834- friend void _init_global_fonts_();
835-
836 uint16 fFamilyID;
837 uint16 fStyleID;
838 float fSize;
839Index: headers/private/app/ServerProtocol.h
840===================================================================
841--- headers/private/app/ServerProtocol.h (révision 30247)
842+++ headers/private/app/ServerProtocol.h (copie de travail)
843@@ -108,6 +108,7 @@
844
845 // Font-related server communications
846 AS_SET_SYSTEM_FONT,
847+ AS_GET_SYSTEM_FONT,
848 AS_GET_SYSTEM_FONTS,
849 AS_GET_SYSTEM_DEFAULT_FONT,
850 AS_SYSTEM_FONT_CHANGED,