LP64 additions
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@46052 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -48,11 +48,14 @@ public:
|
|||||||
, m_underlined(false)
|
, m_underlined(false)
|
||||||
, m_faceName(wxT("applicationfont"))
|
, m_faceName(wxT("applicationfont"))
|
||||||
, m_encoding(wxFONTENCODING_DEFAULT)
|
, m_encoding(wxFONTENCODING_DEFAULT)
|
||||||
|
#ifdef __LP64__
|
||||||
|
#else
|
||||||
, m_macFontFamily(0)
|
, m_macFontFamily(0)
|
||||||
, m_macFontSize(0)
|
, m_macFontSize(0)
|
||||||
, m_macFontStyle(0)
|
, m_macFontStyle(0)
|
||||||
, m_macATSUStyle(0)
|
|
||||||
, m_macATSUFontID(0)
|
, m_macATSUFontID(0)
|
||||||
|
#endif
|
||||||
|
, m_macATSUStyle(0)
|
||||||
{
|
{
|
||||||
Init(m_pointSize, m_family, m_style, m_weight,
|
Init(m_pointSize, m_family, m_style, m_weight,
|
||||||
m_underlined, m_faceName, m_encoding);
|
m_underlined, m_faceName, m_encoding);
|
||||||
@@ -68,11 +71,14 @@ public:
|
|||||||
, m_underlined(data.m_underlined)
|
, m_underlined(data.m_underlined)
|
||||||
, m_faceName(data.m_faceName)
|
, m_faceName(data.m_faceName)
|
||||||
, m_encoding(data.m_encoding)
|
, m_encoding(data.m_encoding)
|
||||||
|
#ifdef __LP64__
|
||||||
|
#else
|
||||||
, m_macFontFamily(data.m_macFontFamily)
|
, m_macFontFamily(data.m_macFontFamily)
|
||||||
, m_macFontSize(data.m_macFontSize)
|
, m_macFontSize(data.m_macFontSize)
|
||||||
, m_macFontStyle(data.m_macFontStyle)
|
, m_macFontStyle(data.m_macFontStyle)
|
||||||
, m_macATSUStyle(0)
|
|
||||||
, m_macATSUFontID(data.m_macATSUFontID)
|
, m_macATSUFontID(data.m_macATSUFontID)
|
||||||
|
#endif
|
||||||
|
, m_macATSUStyle(0)
|
||||||
{
|
{
|
||||||
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
||||||
data.m_underlined, data.m_faceName, data.m_encoding);
|
data.m_underlined, data.m_faceName, data.m_encoding);
|
||||||
@@ -93,11 +99,14 @@ public:
|
|||||||
, m_underlined(underlined)
|
, m_underlined(underlined)
|
||||||
, m_faceName(faceName)
|
, m_faceName(faceName)
|
||||||
, m_encoding(encoding)
|
, m_encoding(encoding)
|
||||||
|
#ifdef __LP64__
|
||||||
|
#else
|
||||||
, m_macFontFamily(0)
|
, m_macFontFamily(0)
|
||||||
, m_macFontSize(0)
|
, m_macFontSize(0)
|
||||||
, m_macFontStyle(0)
|
, m_macFontStyle(0)
|
||||||
, m_macATSUStyle(0)
|
|
||||||
, m_macATSUFontID(0)
|
, m_macATSUFontID(0)
|
||||||
|
#endif
|
||||||
|
, m_macATSUStyle(0)
|
||||||
{
|
{
|
||||||
Init(size, family, style, weight, underlined, faceName, encoding);
|
Init(size, family, style, weight, underlined, faceName, encoding);
|
||||||
}
|
}
|
||||||
@@ -134,6 +143,7 @@ protected:
|
|||||||
bool m_noAA; // No anti-aliasing
|
bool m_noAA; // No anti-aliasing
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
#ifndef __LP64__
|
||||||
FMFontFamily m_macFontFamily;
|
FMFontFamily m_macFontFamily;
|
||||||
FMFontSize m_macFontSize;
|
FMFontSize m_macFontSize;
|
||||||
FMFontStyle m_macFontStyle;
|
FMFontStyle m_macFontStyle;
|
||||||
@@ -144,14 +154,17 @@ public:
|
|||||||
// contain some styles (special bold fonts etc) and
|
// contain some styles (special bold fonts etc) and
|
||||||
// these are the additional qd styles that are not
|
// these are the additional qd styles that are not
|
||||||
// included in the ATSU font id
|
// included in the ATSU font id
|
||||||
ATSUStyle m_macATSUStyle ;
|
|
||||||
ATSUFontID m_macATSUFontID;
|
ATSUFontID m_macATSUFontID;
|
||||||
FMFontStyle m_macATSUAdditionalQDStyles ;
|
FMFontStyle m_macATSUAdditionalQDStyles ;
|
||||||
|
|
||||||
// for true themeing support we must store the correct font
|
// for true themeing support we must store the correct font
|
||||||
// information here, as this speeds up and optimizes rendering
|
// information here, as this speeds up and optimizes rendering
|
||||||
ThemeFontID m_macThemeFontID ;
|
ThemeFontID m_macThemeFontID ;
|
||||||
|
#else
|
||||||
|
CTFontRef m_macFontRef;
|
||||||
|
CTFontUIFontType m_macUIFontType;
|
||||||
|
#endif
|
||||||
|
ATSUStyle m_macATSUStyle ;
|
||||||
wxNativeFontInfo m_info;
|
wxNativeFontInfo m_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -182,15 +195,19 @@ void wxFontRefData::Init(int pointSize,
|
|||||||
m_underlined = underlined;
|
m_underlined = underlined;
|
||||||
m_faceName = faceName;
|
m_faceName = faceName;
|
||||||
m_encoding = encoding;
|
m_encoding = encoding;
|
||||||
|
#ifdef __LP64__
|
||||||
|
m_macUIFontType = kCTFontNoFontType;
|
||||||
|
m_macFontRef = 0;
|
||||||
|
#else
|
||||||
m_macFontFamily = 0 ;
|
m_macFontFamily = 0 ;
|
||||||
m_macFontSize = 0;
|
m_macFontSize = 0;
|
||||||
m_macFontStyle = 0;
|
m_macFontStyle = 0;
|
||||||
m_macATSUFontID = 0;
|
m_macATSUFontID = 0;
|
||||||
m_macATSUAdditionalQDStyles = 0 ;
|
m_macATSUAdditionalQDStyles = 0 ;
|
||||||
m_macATSUStyle = NULL ;
|
|
||||||
|
|
||||||
m_macThemeFontID = kThemeCurrentPortFont ;
|
m_macThemeFontID = kThemeCurrentPortFont ;
|
||||||
|
#endif
|
||||||
|
m_macATSUStyle = NULL ;
|
||||||
m_noAA = false;
|
m_noAA = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,9 +222,109 @@ wxFontRefData::~wxFontRefData()
|
|||||||
|
|
||||||
void wxFontRefData::MacFindFont()
|
void wxFontRefData::MacFindFont()
|
||||||
{
|
{
|
||||||
OSStatus status ;
|
OSStatus status = noErr;
|
||||||
|
|
||||||
Str255 qdFontName ;
|
Str255 qdFontName ;
|
||||||
|
|
||||||
|
#ifdef __LP64__
|
||||||
|
if ( m_faceName.empty() && m_family == wxDEFAULT )
|
||||||
|
{
|
||||||
|
m_macUIFontType = kCTFontSystemFontType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_macUIFontType != kCTFontNoFontType )
|
||||||
|
{
|
||||||
|
m_macFontRef = CTFontCreateUIFontForLanguage( m_macUIFontType, 0.0, NULL );
|
||||||
|
wxMacCFStringHolder name( (CFStringRef) CTFontCopyAttribute( m_macFontRef, kCTFontFamilyNameKey) );
|
||||||
|
m_faceName = name.AsString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( m_faceName.empty() )
|
||||||
|
{
|
||||||
|
switch ( m_family )
|
||||||
|
{
|
||||||
|
case wxSCRIPT :
|
||||||
|
case wxROMAN :
|
||||||
|
case wxDECORATIVE :
|
||||||
|
m_faceName = wxT("Times");
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxSWISS :
|
||||||
|
m_faceName = wxT("Lucida Grande");
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxMODERN :
|
||||||
|
case wxTELETYPE:
|
||||||
|
m_faceName = wxT("Monaco");
|
||||||
|
break ;
|
||||||
|
|
||||||
|
default:
|
||||||
|
m_faceName = wxT("Times");
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacCFStringHolder cf( m_faceName, wxLocale::GetSystemEncoding() );
|
||||||
|
m_macFontRef = CTFontCreateWithName( cf, m_pointSize, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_macATSUStyle )
|
||||||
|
{
|
||||||
|
::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle);
|
||||||
|
m_macATSUStyle = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUStyle);
|
||||||
|
wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") );
|
||||||
|
|
||||||
|
ATSUAttributeTag atsuTags[] =
|
||||||
|
{
|
||||||
|
// kATSUFontTag ,
|
||||||
|
kATSUSizeTag ,
|
||||||
|
kATSUVerticalCharacterTag,
|
||||||
|
kATSUQDBoldfaceTag ,
|
||||||
|
kATSUQDItalicTag ,
|
||||||
|
kATSUQDUnderlineTag ,
|
||||||
|
kATSUQDCondensedTag ,
|
||||||
|
kATSUQDExtendedTag ,
|
||||||
|
};
|
||||||
|
ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] =
|
||||||
|
{
|
||||||
|
// sizeof( ATSUFontID ) ,
|
||||||
|
sizeof( Fixed ) ,
|
||||||
|
sizeof( ATSUVerticalCharacterType),
|
||||||
|
sizeof( Boolean ) ,
|
||||||
|
sizeof( Boolean ) ,
|
||||||
|
sizeof( Boolean ) ,
|
||||||
|
sizeof( Boolean ) ,
|
||||||
|
sizeof( Boolean ) ,
|
||||||
|
};
|
||||||
|
|
||||||
|
Boolean kTrue = true ;
|
||||||
|
Boolean kFalse = false ;
|
||||||
|
|
||||||
|
Fixed atsuSize = IntToFixed( m_macFontSize );
|
||||||
|
ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
|
||||||
|
ATSUAttributeValuePtr atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] =
|
||||||
|
{
|
||||||
|
// &m_macATSUFontID ,
|
||||||
|
&atsuSize ,
|
||||||
|
&kHorizontal,
|
||||||
|
(m_macATSUAdditionalQDStyles & bold) ? &kTrue : &kFalse ,
|
||||||
|
(m_macATSUAdditionalQDStyles & italic) ? &kTrue : &kFalse ,
|
||||||
|
(m_macATSUAdditionalQDStyles & underline) ? &kTrue : &kFalse ,
|
||||||
|
(m_macATSUAdditionalQDStyles & condense) ? &kTrue : &kFalse ,
|
||||||
|
(m_macATSUAdditionalQDStyles & extend) ? &kTrue : &kFalse ,
|
||||||
|
};
|
||||||
|
|
||||||
|
status = ::ATSUSetAttributes(
|
||||||
|
(ATSUStyle)m_macATSUStyle,
|
||||||
|
sizeof(atsuTags) / sizeof(ATSUAttributeTag) ,
|
||||||
|
atsuTags, atsuSizes, atsuValues);
|
||||||
|
|
||||||
|
wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
if ( m_macThemeFontID != kThemeCurrentPortFont )
|
if ( m_macThemeFontID != kThemeCurrentPortFont )
|
||||||
{
|
{
|
||||||
Style style ;
|
Style style ;
|
||||||
@@ -223,9 +340,7 @@ void wxFontRefData::MacFindFont()
|
|||||||
if ( m_macFontStyle & underline )
|
if ( m_macFontStyle & underline )
|
||||||
m_underlined = true ;
|
m_underlined = true ;
|
||||||
m_pointSize = m_macFontSize ;
|
m_pointSize = m_macFontSize ;
|
||||||
#ifndef __LP64__
|
|
||||||
m_macFontFamily = FMGetFontFamilyFromName( qdFontName );
|
m_macFontFamily = FMGetFontFamilyFromName( qdFontName );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -233,11 +348,9 @@ void wxFontRefData::MacFindFont()
|
|||||||
{
|
{
|
||||||
if ( m_family == wxDEFAULT )
|
if ( m_family == wxDEFAULT )
|
||||||
{
|
{
|
||||||
#ifndef __LP64__
|
|
||||||
m_macFontFamily = GetAppFont();
|
m_macFontFamily = GetAppFont();
|
||||||
FMGetFontFamilyName(m_macFontFamily,qdFontName);
|
FMGetFontFamilyName(m_macFontFamily,qdFontName);
|
||||||
m_faceName = wxMacMakeStringFromPascal( qdFontName );
|
m_faceName = wxMacMakeStringFromPascal( qdFontName );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -262,7 +375,6 @@ void wxFontRefData::MacFindFont()
|
|||||||
m_faceName = wxT("Times");
|
m_faceName = wxT("Times");
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
#ifndef __LP64__
|
|
||||||
wxMacStringToPascal( m_faceName , qdFontName );
|
wxMacStringToPascal( m_faceName , qdFontName );
|
||||||
m_macFontFamily = FMGetFontFamilyFromName( qdFontName );
|
m_macFontFamily = FMGetFontFamilyFromName( qdFontName );
|
||||||
if ( m_macFontFamily == kInvalidFontFamily )
|
if ( m_macFontFamily == kInvalidFontFamily )
|
||||||
@@ -270,23 +382,15 @@ void wxFontRefData::MacFindFont()
|
|||||||
wxLogDebug( wxT("ATSFontFamilyFindFromName failed for %s"), m_faceName.c_str() );
|
wxLogDebug( wxT("ATSFontFamilyFindFromName failed for %s"), m_faceName.c_str() );
|
||||||
m_macFontFamily = GetAppFont();
|
m_macFontFamily = GetAppFont();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef __LP64__
|
|
||||||
if ( m_faceName == wxT("systemfont") )
|
if ( m_faceName == wxT("systemfont") )
|
||||||
m_macFontFamily = GetSysFont();
|
m_macFontFamily = GetSysFont();
|
||||||
else if ( m_faceName == wxT("applicationfont") )
|
else if ( m_faceName == wxT("applicationfont") )
|
||||||
m_macFontFamily = GetAppFont();
|
m_macFontFamily = GetAppFont();
|
||||||
else
|
else
|
||||||
#else
|
|
||||||
if ( m_faceName == wxT("systemfont") )
|
|
||||||
m_faceName = wxT("Lucida Grande");
|
|
||||||
else if ( m_faceName == wxT("applicationfont") )
|
|
||||||
m_faceName = wxT("Lucida Grande");
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
wxMacCFStringHolder cf( m_faceName, wxLocale::GetSystemEncoding() );
|
wxMacCFStringHolder cf( m_faceName, wxLocale::GetSystemEncoding() );
|
||||||
ATSFontFamilyRef atsfamily = ATSFontFamilyFindFromName( cf , kATSOptionFlagsDefault );
|
ATSFontFamilyRef atsfamily = ATSFontFamilyFindFromName( cf , kATSOptionFlagsDefault );
|
||||||
@@ -315,10 +419,8 @@ void wxFontRefData::MacFindFont()
|
|||||||
|
|
||||||
// ATSUFontID and FMFont are equivalent
|
// ATSUFontID and FMFont are equivalent
|
||||||
FMFontStyle intrinsicStyle = 0 ;
|
FMFontStyle intrinsicStyle = 0 ;
|
||||||
#ifndef __LP64__
|
|
||||||
status = FMGetFontFromFontFamilyInstance( m_macFontFamily , m_macFontStyle , &m_macATSUFontID , &intrinsicStyle);
|
status = FMGetFontFromFontFamilyInstance( m_macFontFamily , m_macFontStyle , &m_macATSUFontID , &intrinsicStyle);
|
||||||
wxASSERT_MSG( status == noErr , wxT("couldn't get an ATSUFont from font family") );
|
wxASSERT_MSG( status == noErr , wxT("couldn't get an ATSUFont from font family") );
|
||||||
#endif
|
|
||||||
m_macATSUAdditionalQDStyles = m_macFontStyle & (~intrinsicStyle );
|
m_macATSUAdditionalQDStyles = m_macFontStyle & (~intrinsicStyle );
|
||||||
|
|
||||||
if ( m_macATSUStyle )
|
if ( m_macATSUStyle )
|
||||||
@@ -376,6 +478,7 @@ void wxFontRefData::MacFindFont()
|
|||||||
atsuTags, atsuSizes, atsuValues);
|
atsuTags, atsuSizes, atsuValues);
|
||||||
|
|
||||||
wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
|
wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -415,8 +518,29 @@ bool wxFont::Create(int pointSize,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __LP64__
|
||||||
|
|
||||||
|
bool wxFont::MacCreateUIFont(wxUint32 ctFontType )
|
||||||
|
{
|
||||||
|
UnRef();
|
||||||
|
|
||||||
|
m_refData = new wxFontRefData(
|
||||||
|
12, wxDEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL,
|
||||||
|
false, wxEmptyString, wxFONTENCODING_DEFAULT );
|
||||||
|
|
||||||
|
M_FONTDATA->m_macUIFontType = ctFontType ;
|
||||||
|
RealizeResource();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
bool wxFont::MacCreateThemeFont(wxUint16 themeFontID)
|
bool wxFont::MacCreateThemeFont(wxUint16 themeFontID)
|
||||||
{
|
{
|
||||||
|
#ifdef __LP64__
|
||||||
|
return MacCreateUIFont(HIThemeGetUIFontType(themeFontID));
|
||||||
|
#else
|
||||||
UnRef();
|
UnRef();
|
||||||
|
|
||||||
m_refData = new wxFontRefData(
|
m_refData = new wxFontRefData(
|
||||||
@@ -427,8 +551,11 @@ bool wxFont::MacCreateThemeFont(wxUint16 themeFontID)
|
|||||||
RealizeResource();
|
RealizeResource();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
wxFont::~wxFont()
|
wxFont::~wxFont()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -605,6 +732,8 @@ bool wxFont::GetNoAntiAliasing() const
|
|||||||
return M_FONTDATA->m_noAA;
|
return M_FONTDATA->m_noAA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __LP64__
|
||||||
|
|
||||||
short wxFont::MacGetFontNum() const
|
short wxFont::MacGetFontNum() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
|
wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
|
||||||
@@ -653,6 +782,14 @@ wxUint16 wxFont::MacGetThemeFontID() const
|
|||||||
|
|
||||||
return M_FONTDATA->m_macThemeFontID;
|
return M_FONTDATA->m_macThemeFontID;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
const void * wxFont::MacGetCTFont() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
|
||||||
|
|
||||||
|
return M_FONTDATA->m_macFontRef;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const wxNativeFontInfo * wxFont::GetNativeFontInfo() const
|
const wxNativeFontInfo * wxFont::GetNativeFontInfo() const
|
||||||
{
|
{
|
||||||
|
@@ -157,16 +157,28 @@ wxString wxStandardPathsCF::GetExecutablePath() const
|
|||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
ProcessInfoRec processinfo;
|
ProcessInfoRec processinfo;
|
||||||
ProcessSerialNumber procno ;
|
ProcessSerialNumber procno ;
|
||||||
|
#ifdef __LP64__
|
||||||
|
FSRef fsRef;
|
||||||
|
#else
|
||||||
FSSpec fsSpec;
|
FSSpec fsSpec;
|
||||||
|
#endif
|
||||||
|
|
||||||
procno.highLongOfPSN = 0 ;
|
procno.highLongOfPSN = 0 ;
|
||||||
procno.lowLongOfPSN = kCurrentProcess ;
|
procno.lowLongOfPSN = kCurrentProcess ;
|
||||||
processinfo.processInfoLength = sizeof(ProcessInfoRec);
|
processinfo.processInfoLength = sizeof(ProcessInfoRec);
|
||||||
processinfo.processName = NULL;
|
processinfo.processName = NULL;
|
||||||
|
#ifdef __LP64__
|
||||||
|
processinfo.processAppRef = &fsRef;
|
||||||
|
#else
|
||||||
processinfo.processAppSpec = &fsSpec;
|
processinfo.processAppSpec = &fsSpec;
|
||||||
|
#endif
|
||||||
|
|
||||||
GetProcessInformation( &procno , &processinfo ) ;
|
GetProcessInformation( &procno , &processinfo ) ;
|
||||||
|
#ifdef __LP64__
|
||||||
|
return wxMacFSRefToPath(&fsRef);
|
||||||
|
#else
|
||||||
return wxMacFSSpec2MacFilename(&fsSpec);
|
return wxMacFSSpec2MacFilename(&fsSpec);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
return wxStandardPathsBase::GetExecutablePath();
|
return wxStandardPathsBase::GetExecutablePath();
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user