* Locale Roster : add a function to update the settings from a BMessage
* Locale preference : send such a message broadcast to all applications when the settings are changed * Deskbar : receive the message and forward it to the locale roster. This way the time display on the deskbar changes as soon as you close the locale preflet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37663 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
4bfbcb535d
commit
9a78a691f8
@ -513,6 +513,12 @@ TBarApp::MessageReceived(BMessage* message)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case B_LOCALE_CHANGED:
|
||||||
|
{
|
||||||
|
be_locale_roster->UpdateSettings(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BApplication::MessageReceived(message);
|
BApplication::MessageReceived(message);
|
||||||
break;
|
break;
|
||||||
|
@ -193,6 +193,7 @@ struct RosterData {
|
|||||||
void InitializeCatalogAddOns();
|
void InitializeCatalogAddOns();
|
||||||
void CleanupCatalogAddOns();
|
void CleanupCatalogAddOns();
|
||||||
static int CompareInfos(const void *left, const void *right);
|
static int CompareInfos(const void *left, const void *right);
|
||||||
|
void UpdateSettings(BMessage* newSettings);
|
||||||
};
|
};
|
||||||
static RosterData gRosterData;
|
static RosterData gRosterData;
|
||||||
|
|
||||||
@ -201,8 +202,6 @@ RosterData::RosterData()
|
|||||||
:
|
:
|
||||||
fLock("LocaleRosterData")
|
fLock("LocaleRosterData")
|
||||||
{
|
{
|
||||||
BAutolock lock(fLock);
|
|
||||||
assert(lock.IsLocked());
|
|
||||||
|
|
||||||
openlog_team("liblocale.so", LOG_PID, LOG_USER);
|
openlog_team("liblocale.so", LOG_PID, LOG_USER);
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
@ -219,43 +218,7 @@ RosterData::RosterData()
|
|||||||
BMessage settingsMessage;
|
BMessage settingsMessage;
|
||||||
if (file.SetTo(path.Path(), B_READ_ONLY) == B_OK
|
if (file.SetTo(path.Path(), B_READ_ONLY) == B_OK
|
||||||
&& settingsMessage.Unflatten(&file) == B_OK) {
|
&& settingsMessage.Unflatten(&file) == B_OK) {
|
||||||
BString langName;
|
UpdateSettings(&settingsMessage);
|
||||||
if (settingsMessage.FindString("language", &langName) == B_OK) {
|
|
||||||
UErrorCode icuError = U_ZERO_ERROR;
|
|
||||||
Locale icuLocale = Locale::createCanonical(langName.String());
|
|
||||||
assert(!icuLocale.isBogus());
|
|
||||||
UnicodeString ustr;
|
|
||||||
BString bstr;
|
|
||||||
BStringByteSink bbs(&bstr);
|
|
||||||
icuLocale.getDisplayName(ustr);
|
|
||||||
ustr.toUTF8(bbs);
|
|
||||||
|
|
||||||
Locale::setDefault(icuLocale, icuError);
|
|
||||||
assert(icuError == U_ZERO_ERROR);
|
|
||||||
fPreferredLanguages.RemoveName("language");
|
|
||||||
for (int i = 0; settingsMessage.FindString("language", i,
|
|
||||||
&langName) == B_OK; i++) {
|
|
||||||
fPreferredLanguages.AddString("language", langName);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
fPreferredLanguages.AddString("language", "en");
|
|
||||||
|
|
||||||
BString codeName;
|
|
||||||
|
|
||||||
if (settingsMessage.FindString("country", &codeName)
|
|
||||||
== B_OK)
|
|
||||||
fDefaultCountry = BCountry(codeName);
|
|
||||||
else
|
|
||||||
fDefaultCountry = BCountry("en_US");
|
|
||||||
|
|
||||||
BString timeFormat;
|
|
||||||
if (settingsMessage.FindString("shortTimeFormat", &timeFormat)
|
|
||||||
== B_OK)
|
|
||||||
fDefaultCountry.SetTimeFormat(timeFormat, false);
|
|
||||||
if (settingsMessage.FindString("longTimeFormat", &timeFormat)
|
|
||||||
== B_OK)
|
|
||||||
fDefaultCountry.SetTimeFormat(timeFormat, true);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -574,6 +537,58 @@ BLocaleRoster::SetDefaultCountry(BCountry* newDefault) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
BLocaleRoster::UpdateSettings(BMessage* newSettings)
|
||||||
|
{
|
||||||
|
gRosterData.UpdateSettings(newSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
RosterData::UpdateSettings(BMessage* newSettings)
|
||||||
|
{
|
||||||
|
BAutolock lock(fLock);
|
||||||
|
assert(lock.IsLocked());
|
||||||
|
|
||||||
|
BString langName;
|
||||||
|
if (newSettings->FindString("language", &langName) == B_OK) {
|
||||||
|
UErrorCode icuError = U_ZERO_ERROR;
|
||||||
|
Locale icuLocale = Locale::createCanonical(langName.String());
|
||||||
|
assert(!icuLocale.isBogus());
|
||||||
|
UnicodeString ustr;
|
||||||
|
BString bstr;
|
||||||
|
BStringByteSink bbs(&bstr);
|
||||||
|
icuLocale.getDisplayName(ustr);
|
||||||
|
ustr.toUTF8(bbs);
|
||||||
|
|
||||||
|
Locale::setDefault(icuLocale, icuError);
|
||||||
|
assert(icuError == U_ZERO_ERROR);
|
||||||
|
fPreferredLanguages.RemoveName("language");
|
||||||
|
for (int i = 0; newSettings->FindString("language", i,
|
||||||
|
&langName) == B_OK; i++) {
|
||||||
|
fPreferredLanguages.AddString("language", langName);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
fPreferredLanguages.AddString("language", "en");
|
||||||
|
|
||||||
|
BString codeName;
|
||||||
|
|
||||||
|
if (newSettings->FindString("country", &codeName)
|
||||||
|
== B_OK)
|
||||||
|
fDefaultCountry = BCountry(codeName);
|
||||||
|
else
|
||||||
|
fDefaultCountry = BCountry("en_US");
|
||||||
|
|
||||||
|
BString timeFormat;
|
||||||
|
if (newSettings->FindString("shortTimeFormat", &timeFormat)
|
||||||
|
== B_OK)
|
||||||
|
fDefaultCountry.SetTimeFormat(timeFormat, false);
|
||||||
|
if (newSettings->FindString("longTimeFormat", &timeFormat)
|
||||||
|
== B_OK)
|
||||||
|
fDefaultCountry.SetTimeFormat(timeFormat, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BLocaleRoster::GetPreferredLanguages(BMessage* languages) const
|
BLocaleRoster::GetPreferredLanguages(BMessage* languages) const
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,9 @@
|
|||||||
#include "LocaleSettings.h"
|
#include "LocaleSettings.h"
|
||||||
|
|
||||||
#include <FindDirectory.h>
|
#include <FindDirectory.h>
|
||||||
|
#include <LocaleRoster.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
|
#include <Roster.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
#include <SupportDefs.h>
|
#include <SupportDefs.h>
|
||||||
|
|
||||||
@ -44,6 +46,11 @@ LocaleSettings::Load()
|
|||||||
status_t
|
status_t
|
||||||
LocaleSettings::Save()
|
LocaleSettings::Save()
|
||||||
{
|
{
|
||||||
|
// Send to all running apps to notify them they should update their settings
|
||||||
|
fMessage.what = B_LOCALE_CHANGED;
|
||||||
|
be_roster->Broadcast(&fMessage);
|
||||||
|
|
||||||
|
// Save on disk for next time we reboot
|
||||||
BFile file;
|
BFile file;
|
||||||
status_t err;
|
status_t err;
|
||||||
err = _Open(&file, B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
|
err = _Open(&file, B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user