[haiku-commits] BRANCH looncraz-github.fontaware [b9e209061ce8] src/servers/app src/kits/interface src/kits/app headers/os/interface

  • From: looncraz-github.fontaware <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 26 Oct 2015 04:32:03 +0100 (CET)

added 1 changeset to branch 'refs/remotes/looncraz-github/fontaware'
old head: 0000000000000000000000000000000000000000
new head: b9e209061ce8a75fabc8d4dd80bb999b61ed04a9
overview: https://github.com/looncraz/haiku/compare/b9e209061ce8

----------------------------------------------------------------------------

b9e209061ce8: Initial font awareness

This is already surprisingly functional.

[ looncraz <looncraz@xxxxxxxxxxxx> ]

----------------------------------------------------------------------------

Commit: b9e209061ce8a75fabc8d4dd80bb999b61ed04a9
Author: looncraz <looncraz@xxxxxxxxxxxx>
Date: Mon Oct 26 03:27:58 2015 UTC

----------------------------------------------------------------------------

11 files changed, 152 insertions(+), 28 deletions(-)
headers/os/interface/InterfaceDefs.h | 10 ++++
headers/private/interface/ViewPrivate.h | 1 +
src/kits/app/Application.cpp | 24 ++++++++++
src/kits/interface/View.cpp | 33 +++++++++++++
src/servers/app/Desktop.cpp | 12 +++++
src/servers/app/Desktop.h | 1 +
src/servers/app/DesktopSettings.cpp | 70 +++++++++++++++++++++-------
src/servers/app/DesktopSettings.h | 1 +
src/servers/app/DesktopSettingsPrivate.h | 6 +--
src/servers/app/ServerApp.cpp | 13 ++++++
src/servers/app/ServerWindow.cpp | 9 ----

----------------------------------------------------------------------------

diff --git a/headers/os/interface/InterfaceDefs.h
b/headers/os/interface/InterfaceDefs.h
index 93dee79..4225ec7 100644
--- a/headers/os/interface/InterfaceDefs.h
+++ b/headers/os/interface/InterfaceDefs.h
@@ -404,6 +404,16 @@ enum {
};


+// Global font definitions for B_FONTS_UPDATED
+enum font_which {
+ B_UNKNOWN_FONT = 0,
+ B_PLAIN_FONT = 1, // be_plain_font
+ B_BOLD_FONT = 2, // be_bold_font
+ B_FIXED_FONT = 3, // be_fixed_font
+ B_MENU_FONT = 4 // menu_info...
+};
+
+
status_t get_deskbar_frame(BRect* frame);

const color_map* system_colors();
diff --git a/headers/private/interface/ViewPrivate.h
b/headers/private/interface/ViewPrivate.h
index 676454a..82d7fd9 100644
--- a/headers/private/interface/ViewPrivate.h
+++ b/headers/private/interface/ViewPrivate.h
@@ -144,6 +144,7 @@ class ViewState {
alpha_function alpha_function_mode;

// fonts
+ font_which which_font;
BFont font;
uint16 font_flags;
bool font_aliasing;
diff --git a/src/kits/app/Application.cpp b/src/kits/app/Application.cpp
index cda2c6d..eb02683 100644
--- a/src/kits/app/Application.cpp
+++ b/src/kits/app/Application.cpp
@@ -214,6 +214,10 @@ check_app_signature(const char* signature)
}


+// BFont update method
+void _init_global_fonts_();
+
+
#ifndef RUN_WITHOUT_REGISTRAR
// Fills the passed BMessage with B_ARGV_RECEIVED infos.
static void
@@ -688,6 +692,26 @@ BApplication::MessageReceived(BMessage* message)
be_roster->ActivateApp(Team());
break;

+ case B_FONTS_UPDATED:
+ {
+ // Each application must update its own font globals
+ _init_global_fonts_();
+
+ AutoLocker<BLooperList> listLock(gLooperList);
+ if (!listLock.IsLocked())
+ break;
+
+ BWindow* window = NULL;
+ uint32 count = gLooperList.CountLoopers();
+ for (uint32 index = 0; index < count; ++index) {
+ window =
dynamic_cast<BWindow*>(gLooperList.LooperAt(index));
+ if (window == NULL || (window != NULL &&
window->fOffscreen))
+ continue;
+ window->PostMessage(message);
+ }
+ break;
+ }
+
case kMsgAppServerRestarted:
_ReconnectToServer();
break;
diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp
index 41f9563..3854863 100644
--- a/src/kits/interface/View.cpp
+++ b/src/kits/interface/View.cpp
@@ -165,6 +165,7 @@ ViewState::ViewState()

scale = 1.0;

+ which_font = B_PLAIN_FONT;
font = *be_plain_font;
font_flags = font.Flags();
font_aliasing = false;
@@ -2697,6 +2698,15 @@ BView::SetFont(const BFont* font, uint32 mask)
if (!font || mask == 0)
return;

+ if (font == be_plain_font)
+ fState->which_font = B_PLAIN_FONT;
+ else if (font == be_bold_font)
+ fState->which_font = B_BOLD_FONT;
+ else if (font == be_fixed_font)
+ fState->which_font = B_FIXED_FONT;
+ else
+ fState->which_font = B_UNKNOWN_FONT;
+
if (mask == B_FONT_ALL) {
fState->font = *font;
} else {
@@ -6002,12 +6012,35 @@ BView::_DrawAfterChildren(BRect updateRect)
void
BView::_FontsUpdated(BMessage* message)
{
+ font_which which = B_UNKNOWN_FONT;
+ if (fState->which_font != B_UNKNOWN_FONT
+ && message->FindInt32("which", (int32*)&which) == B_OK
+ && fState->which_font == which) {
+
+ switch (which) {
+ case B_PLAIN_FONT:
+ SetFont(be_plain_font, fState->font_flags);
+ break;
+ case B_BOLD_FONT:
+ SetFont(be_bold_font, fState->font_flags);
+ break;
+ case B_FIXED_FONT:
+ SetFont(be_fixed_font, fState->font_flags);
+ break;
+ default:
+ break;
+ }
+ }
+
MessageReceived(message);

for (BView* child = fFirstChild; child != NULL;
child = child->fNextSibling) {
child->_FontsUpdated(message);
}
+
+ InvalidateLayout();
+ Invalidate();
}


diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp
index 0d603b4..e894142 100644
--- a/src/servers/app/Desktop.cpp
+++ b/src/servers/app/Desktop.cpp
@@ -628,6 +628,18 @@ Desktop::GetAllWindowTargets(DelayedMessage& message)
}


+int32
+Desktop::GetAllAppTargets(DelayedMessage& message)
+{
+ BAutolock _(fApplicationsLock);
+
+ for (int32 index = 0; index < fApplications.CountItems(); ++index)
+ message.AddTarget(fApplications.ItemAt(index)->MessagePort());
+
+ return fApplications.CountItems();
+}
+
+
filter_result
Desktop::KeyEvent(uint32 what, int32 key, int32 modifiers)
{
diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h
index 6d6856d..dda1f75 100644
--- a/src/servers/app/Desktop.h
+++ b/src/servers/app/Desktop.h
@@ -86,6 +86,7 @@ public:
uint32
mergeMode = DM_NO_MERGE);

int32
GetAllWindowTargets(DelayedMessage& message);
+ int32
GetAllAppTargets(DelayedMessage& message);

filter_result KeyEvent(uint32 what, int32 key,
int32
modifiers);
diff --git a/src/servers/app/DesktopSettings.cpp
b/src/servers/app/DesktopSettings.cpp
index 8a2a093..4f87499 100644
--- a/src/servers/app/DesktopSettings.cpp
+++ b/src/servers/app/DesktopSettings.cpp
@@ -461,11 +461,15 @@ DesktopSettingsPrivate::Save(uint32 mask)
}


-void
+bool
DesktopSettingsPrivate::SetDefaultPlainFont(const ServerFont &font)
{
+ if (fPlainFont == font)
+ return false;
+
fPlainFont = font;
Save(kFontSettings);
+ return true;
}


@@ -476,11 +480,15 @@ DesktopSettingsPrivate::DefaultPlainFont() const
}


-void
+bool
DesktopSettingsPrivate::SetDefaultBoldFont(const ServerFont &font)
{
+ if (fBoldFont == font)
+ return false;
+
fBoldFont = font;
Save(kFontSettings);
+ return true;
}


@@ -491,11 +499,15 @@ DesktopSettingsPrivate::DefaultBoldFont() const
}


-void
+bool
DesktopSettingsPrivate::SetDefaultFixedFont(const ServerFont &font)
{
+ if (fFixedFont == font)
+ return false;
+
fFixedFont = font;
Save(kFontSettings);
+ return true;
}


@@ -958,31 +970,32 @@ LockedDesktopSettings::~LockedDesktopSettings()
void
LockedDesktopSettings::SetDefaultPlainFont(const ServerFont &font)
{
- fSettings->SetDefaultPlainFont(font);
- fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
- true, DM_MERGE_CANCEL);
+ if (fSettings->SetDefaultPlainFont(font))
+ _FontChanged(B_PLAIN_FONT);
}


void
LockedDesktopSettings::SetDefaultBoldFont(const ServerFont &font)
{
- fSettings->SetDefaultBoldFont(font);
- fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
- DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
- fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
- true, DM_MERGE_CANCEL);
+ if (fSettings->SetDefaultBoldFont(font)) {
+ fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
+ DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
+
+ _FontChanged(B_BOLD_FONT);
+ }
}


void
LockedDesktopSettings::SetDefaultFixedFont(const ServerFont &font)
{
- fSettings->SetDefaultFixedFont(font);
- fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
- DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
- fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
- true, DM_MERGE_CANCEL);
+ if (fSettings->SetDefaultFixedFont(font)) {
+ fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
+ DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
+
+ _FontChanged(B_FIXED_FONT);
+ }
}


@@ -996,7 +1009,18 @@ LockedDesktopSettings::SetScrollBarInfo(const
scroll_bar_info& info)
void
LockedDesktopSettings::SetMenuInfo(const menu_info& info)
{
+ const menu_info& current = fSettings->MenuInfo();
+ bool fontChanged = false;
+
+ if (info.font_size != current.font_size
+ || info.f_family != current.f_family
+ || info.f_style != current.f_style)
+ fontChanged = true;
+
fSettings->SetMenuInfo(info);
+
+ if (fontChanged)
+ _FontChanged(B_MENU_FONT);
}


@@ -1080,9 +1104,23 @@ LockedDesktopSettings::SetSubpixelAverageWeight(uint8
averageWeight)
fSettings->SetSubpixelAverageWeight(averageWeight);
}

+
void
LockedDesktopSettings::SetSubpixelOrderingRegular(bool subpixelOrdering)
{
fSettings->SetSubpixelOrderingRegular(subpixelOrdering);
}

+
+void
+LockedDesktopSettings::_FontChanged(font_which which)
+{
+ DelayedMessage delayed(-1, B_FONTS_UPDATED, DM_60HZ_DELAY,
+ B_RELATIVE_TIMEOUT, DM_MERGE_DUPLICATES);
+
+ if (fDesktop->GetAllAppTargets(delayed) <= 0)
+ return;
+
+ if (delayed.Attach<font_which>(which) == B_OK)
+ delayed.Flush();
+}
diff --git a/src/servers/app/DesktopSettings.h
b/src/servers/app/DesktopSettings.h
index 6f0a2df..3aa385f 100644
--- a/src/servers/app/DesktopSettings.h
+++ b/src/servers/app/DesktopSettings.h
@@ -110,6 +110,7 @@ public:
bool
subpixelOrdering);

private:
+ void _FontChanged(font_which
which);
Desktop* fDesktop;
};

diff --git a/src/servers/app/DesktopSettingsPrivate.h
b/src/servers/app/DesktopSettingsPrivate.h
index 679b1b4..35f7b5e 100644
--- a/src/servers/app/DesktopSettingsPrivate.h
+++ b/src/servers/app/DesktopSettingsPrivate.h
@@ -28,13 +28,13 @@ public:

status_t Save(uint32 mask =
kAllSettings);

- void
SetDefaultPlainFont(const ServerFont& font);
+ bool
SetDefaultPlainFont(const ServerFont& font);
const ServerFont& DefaultPlainFont() const;

- void
SetDefaultBoldFont(const ServerFont& font);
+ bool
SetDefaultBoldFont(const ServerFont& font);
const ServerFont& DefaultBoldFont() const;

- void
SetDefaultFixedFont(const ServerFont& font);
+ bool
SetDefaultFixedFont(const ServerFont& font);
const ServerFont& DefaultFixedFont() const;

void SetScrollBarInfo(const
scroll_bar_info &info);
diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp
index 8a1d24b..06c9352 100644
--- a/src/servers/app/ServerApp.cpp
+++ b/src/servers/app/ServerApp.cpp
@@ -1826,6 +1826,19 @@ ServerApp::_DispatchMessage(int32 code,
BPrivate::LinkReceiver& link)
break;
}

+ case B_FONTS_UPDATED:
+ {
+ font_which which = B_UNKNOWN_FONT;
+ if (link.Read<font_which>(&which) != B_OK
+ || which == B_UNKNOWN_FONT)
+ break;
+
+ BMessage message(B_FONTS_UPDATED);
+ message.AddInt32("which", (int32)which);
+ SendMessageToClient(&message);
+ break;
+ }
+
case AS_GET_STRING_WIDTHS:
{
FTRACE(("ServerApp %s: AS_GET_STRING_WIDTHS\n",
Signature()));
diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp
index 560c64a..809d01b 100644
--- a/src/servers/app/ServerWindow.cpp
+++ b/src/servers/app/ServerWindow.cpp
@@ -1016,15 +1016,6 @@ ServerWindow::_DispatchMessage(int32 code,
BPrivate::LinkReceiver& link)
break;
}

- // Forward to client
- case B_FONTS_UPDATED:
- {
- // TODO: would knowing which font was changed be useful?
- BMessage message(code);
- SendMessageToClient(&message);
- break;
- }
-
case AS_COLOR_MAP_UPDATED:
{
BPrivate::BColorMapData* data = NULL;


Other related posts:

  • » [haiku-commits] BRANCH looncraz-github.fontaware [b9e209061ce8] src/servers/app src/kits/interface src/kits/app headers/os/interface - looncraz-github . fontaware