Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
acd45283
Commit
acd45283
authored
Apr 09, 2020
by
Ulrich Sibiller
Committed by
Mike Gabriel
May 07, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Font.c: cleanup
reformat, whitespace, code simplification, FIXMEs
parent
92589f41
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1071 additions
and
1076 deletions
+1071
-1076
Font.c
nx-X11/programs/Xserver/hw/nxagent/Font.c
+1071
-1076
No files found.
nx-X11/programs/Xserver/hw/nxagent/Font.c
View file @
acd45283
...
...
@@ -113,15 +113,15 @@ static void printFontCacheDump(char*);
typedef
struct
_nxagentFontRec
{
char
*
name
;
int
status
;
char
*
name
;
int
status
;
}
nxagentFontRec
,
*
nxagentFontRecPtr
;
typedef
struct
_nxagentFontList
{
nxagentFontRecPtr
*
list
;
int
length
;
int
listSize
;
nxagentFontRecPtr
*
list
;
int
length
;
int
listSize
;
}
nxagentFontList
,
*
nxagentFontListPtr
;
nxagentFontList
nxagentRemoteFontList
=
{
NULL
,
(
int
)
0
,
(
int
)
0
};
...
...
@@ -130,16 +130,16 @@ int nxagentFontPrivateIndex;
typedef
struct
_nxCacheFontEntry
{
Atom
atom
;
XFontStruct
*
font_struct
;
char
*
name
;
Atom
atom
;
XFontStruct
*
font_struct
;
char
*
name
;
}
nxCacheFontEntryRec
,
*
nxCacheFontEntryRecPtr
;
static
struct
_nxagentFontCache
{
nxCacheFontEntryRecPtr
*
entry
;
int
index
;
int
size
;
nxCacheFontEntryRecPtr
*
entry
;
int
index
;
int
size
;
}
nxagentFontCache
=
{
NULL
,
(
int
)
0
,
(
int
)
0
};
#define CACHE_ENTRY_PTR (nxagentFontCache.entry)
...
...
@@ -152,10 +152,10 @@ static struct _nxagentFontCache
static
struct
_nxagentFailedToReconnectFonts
{
FontPtr
*
font
;
XID
*
id
;
int
size
;
int
index
;
FontPtr
*
font
;
XID
*
id
;
int
size
;
int
index
;
}
nxagentFailedToReconnectFonts
=
{
NULL
,
NULL
,
0
,
0
};
/*
...
...
@@ -164,519 +164,521 @@ static struct _nxagentFailedToReconnectFonts
void
nxagentFreeFontCache
(
void
)
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: Freeing nxagent font cache
\n
"
);
#endif
if
(
CACHE_INDEX
==
0
)
return
;
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: Freeing nxagent font cache
\n
"
);
#endif
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: Freeing nxagent font cache, there are [%d] entries.
\n
"
,
CACHE_INDEX
);
#endif
if
(
CACHE_INDEX
==
0
)
return
;
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: Freeing nxagent font cache entry [%d] entry pointer is [%p], name [%s]
\n
"
,
i
,
CACHE_ENTRY
(
i
),
CACHE_NAME
(
i
));
fprintf
(
stderr
,
"Font: Freeing nxagent font cache, there are [%d] entries.
\n
"
,
CACHE_INDEX
);
#endif
if
(
CACHE_FSTRUCT
(
i
)
)
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
nxagentFreeFont
(
CACHE_FSTRUCT
(
i
));
}
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: Freeing nxagent font cache entry [%d] entry pointer is [%p], name [%s]
\n
"
,
i
,
CACHE_ENTRY
(
i
),
CACHE_NAME
(
i
));
#endif
SAFE_free
(
CACHE_NAME
(
i
));
SAFE_free
(
CACHE_ENTRY
(
i
));
}
if
(
CACHE_FSTRUCT
(
i
))
{
nxagentFreeFont
(
CACHE_FSTRUCT
(
i
));
}
SAFE_free
(
CACHE_ENTRY_PTR
);
CACHE_ENTRY_PTR
=
NULL
;
CACHE_INDEX
=
0
;
CACHE_SIZE
=
0
;
SAFE_free
(
CACHE_NAME
(
i
));
SAFE_free
(
CACHE_ENTRY
(
i
));
}
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagent font cache fully freed
\n
"
);
#endif
SAFE_free
(
CACHE_ENTRY_PTR
);
CACHE_ENTRY_PTR
=
NULL
;
CACHE_INDEX
=
0
;
CACHE_SIZE
=
0
;
return
;
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagent font cache fully freed
\n
"
);
#endif
return
;
}
void
nxagentListRemoteFonts
(
const
char
*
searchPattern
,
const
int
maxNames
)
{
char
**
xList
;
int
xLen
=
0
;
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
{
return
;
}
const
char
*
patterns
[]
=
{
"*"
,
"-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
};
int
patternsQt
=
2
;
/*
* Avoid querying again the remote fonts.
*/
if
(
NXDisplayError
(
nxagentDisplay
)
==
1
)
{
return
;
}
if
(
nxagentRemoteFontList
.
length
>
0
)
{
return
;
}
/*
* Avoid querying again the remote fonts.
*/
/*
* We can't retrieve the full remote font list with a single query,
* because the number of dashes in the pattern acts as a rule to
* select how to search for the font names, so the pattern '*' is
* useful to retrieve the font aliases, while the other one will
* select the 'real' fonts.
*/
if
(
nxagentRemoteFontList
.
length
>
0
)
{
return
;
}
const
char
*
patterns
[]
=
{
"*"
,
"-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
};
const
int
numPatterns
=
2
;
/*
* We can't retrieve the full remote font list with a single query,
* because the number of dashes in the pattern acts as a rule to
* select how to search for the font names, so the pattern '*' is
* useful to retrieve the font aliases, while the other one will
* select the 'real' fonts.
*/
for
(
int
p
=
0
;
p
<
numPatterns
;
p
++
)
{
int
xLen
=
0
;
char
**
xList
=
XListFonts
(
nxagentDisplay
,
patterns
[
p
],
maxNames
,
&
xLen
);
for
(
int
p
=
0
;
p
<
patternsQt
;
p
++
)
{
xList
=
XListFonts
(
nxagentDisplay
,
patterns
[
p
],
maxNames
,
&
xLen
);
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"nxagentListRemoteFonts: NXagent remote list [%s] has %d elements.
\n
"
,
patterns
[
p
],
xLen
);
#endif
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"nxagentListRemoteFonts: NXagent remote list [%s] has %d elements.
\n
"
,
patterns
[
p
],
xLen
);
#endif
/*
* Add the ListFont request pattern to the list with the last
* requested maxnames.
*/
/*
* Add the ListFont request pattern to the list with the last
* requested maxnames.
*/
nxagentListRemoteAddName
(
searchPattern
,
maxNames
);
nxagentListRemoteAddName
(
searchPattern
,
maxNames
);
for
(
int
i
=
0
;
i
<
xLen
;
i
++
)
{
nxagentListRemoteAddName
(
xList
[
i
],
1
);
}
for
(
int
i
=
0
;
i
<
xLen
;
i
++
)
{
nxagentListRemoteAddName
(
xList
[
i
],
1
);
XFreeFontNames
(
xList
);
}
XFreeFontNames
(
xList
);
}
#ifdef NXAGENT_FONTMATCH_DEBUG
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"nxagentListRemoteFonts: Printing remote font list.
\n
"
);
fprintf
(
stderr
,
"nxagentListRemoteFonts: Printing remote font list.
\n
"
);
for
(
int
i
=
0
;
i
<
nxagentRemoteFontList
.
length
;
i
++
)
{
fprintf
(
stderr
,
"Font# %d,
\"
%s
\"\n
"
,
i
,
nxagentRemoteFontList
.
list
[
i
]
->
name
);
}
for
(
int
i
=
0
;
i
<
nxagentRemoteFontList
.
length
;
i
++
)
{
fprintf
(
stderr
,
"Font# %d,
\"
%s
\"\n
"
,
i
,
nxagentRemoteFontList
.
list
[
i
]
->
name
);
}
fprintf
(
stderr
,
"nxagentListRemoteFonts: End of list
\n
"
);
fprintf
(
stderr
,
"nxagentListRemoteFonts: End of list
\n
"
);
#endif
#endif
}
void
nxagentListRemoteAddName
(
const
char
*
name
,
int
status
)
{
int
pos
;
int
pos
;
if
(
nxagentFontFind
(
name
,
&
pos
))
{
if
(
nxagentRemoteFontList
.
list
[
pos
]
->
status
<
status
)
{
nxagentRemoteFontList
.
list
[
pos
]
->
status
=
status
;
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Font# %d, [%s] change status to %s
\n
"
,
pos
,
nxagentRemoteFontList
.
list
[
pos
]
->
name
,
nxagentRemoteFontList
.
list
[
pos
]
->
status
?
"OK"
:
"deleted"
);
#endif
}
return
;
}
if
(
nxagentFontFind
(
name
,
&
pos
))
{
if
(
nxagentRemoteFontList
.
list
[
pos
]
->
status
<
status
)
{
nxagentRemoteFontList
.
list
[
pos
]
->
status
=
status
;
if
(
nxagentRemoteFontList
.
length
==
nxagentRemoteFontList
.
listSize
)
{
nxagentRemoteFontList
.
list
=
realloc
(
nxagentRemoteFontList
.
list
,
sizeof
(
nxagentFontRecPtr
)
*
(
nxagentRemoteFontList
.
listSize
+
1000
));
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Font# %d, [%s] change status to %s
\n
"
,
pos
,
nxagentRemoteFontList
.
list
[
pos
]
->
name
,
nxagentRemoteFontList
.
list
[
pos
]
->
status
?
"OK"
:
"deleted"
);
#endif
}
return
;
}
if
(
nxagentRemoteFontList
.
list
==
NULL
)
{
FatalError
(
"Font: remote list memory re-allocation failed!.
\n
"
);
}
if
(
nxagentRemoteFontList
.
length
==
nxagentRemoteFontList
.
listSize
)
{
/* FIXME: if realloc fails the pointer is lost! */
nxagentRemoteFontList
.
list
=
realloc
(
nxagentRemoteFontList
.
list
,
sizeof
(
nxagentFontRecPtr
)
*
(
nxagentRemoteFontList
.
listSize
+
1000
));
nxagentRemoteFontList
.
listSize
+=
1000
;
}
if
(
nxagentRemoteFontList
.
list
==
NULL
)
{
FatalError
(
"Font: remote list memory re-allocation failed!.
\n
"
);
}
if
(
pos
<
nxagentRemoteFontList
.
length
)
{
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Going to move list from %p to %p len = %d!.
\n
"
,
&
nxagentRemoteFontList
.
list
[
pos
],
&
nxagentRemoteFontList
.
list
[
pos
+
1
],
(
nxagentRemoteFontList
.
length
-
pos
)
*
sizeof
(
nxagentFontRecPtr
));
#endif
nxagentRemoteFontList
.
listSize
+=
1000
;
}
memmove
(
&
nxagentRemoteFontList
.
list
[
pos
+
1
],
&
nxagentRemoteFontList
.
list
[
pos
],
(
nxagentRemoteFontList
.
length
-
pos
)
*
sizeof
(
nxagentFontRecPtr
));
}
if
(
pos
<
nxagentRemoteFontList
.
length
)
{
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Going to move list from %p to %p len = %d!.
\n
"
,
&
nxagentRemoteFontList
.
list
[
pos
],
&
nxagentRemoteFontList
.
list
[
pos
+
1
],
(
nxagentRemoteFontList
.
length
-
pos
)
*
sizeof
(
nxagentFontRecPtr
));
#endif
if
((
nxagentRemoteFontList
.
list
[
pos
]
=
malloc
(
sizeof
(
nxagentFontRec
))))
{
nxagentRemoteFontList
.
list
[
pos
]
->
name
=
strdup
(
name
);
if
(
nxagentRemoteFontList
.
list
[
pos
]
->
name
==
NULL
)
memmove
(
&
nxagentRemoteFontList
.
list
[
pos
+
1
],
&
nxagentRemoteFontList
.
list
[
pos
],
(
nxagentRemoteFontList
.
length
-
pos
)
*
sizeof
(
nxagentFontRecPtr
));
}
if
((
nxagentRemoteFontList
.
list
[
pos
]
=
malloc
(
sizeof
(
nxagentFontRec
))))
{
nxagentRemoteFontList
.
list
[
pos
]
->
name
=
strdup
(
name
);
if
(
nxagentRemoteFontList
.
list
[
pos
]
->
name
==
NULL
)
{
fprintf
(
stderr
,
"Font: remote list name memory allocation failed!.
\n
"
);
SAFE_free
(
nxagentRemoteFontList
.
list
[
pos
]);
return
;
}
}
else
{
fprintf
(
stderr
,
"Font: remote list name memory allocation failed!.
\n
"
);
SAFE_free
(
nxagentRemoteFontList
.
list
[
pos
]);
return
;
fprintf
(
stderr
,
"Font: remote list record memory allocation failed!.
\n
"
);
return
;
}
}
else
{
fprintf
(
stderr
,
"Font: remote list record memory allocation failed!.
\n
"
);
return
;
}
nxagentRemoteFontList
.
list
[
pos
]
->
status
=
status
;
nxagentRemoteFontList
.
length
++
;
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: remote font list added [%s] in position [%d] as %s !.
\n
"
,
name
,
pos
,
status
?
"OK"
:
"deleted"
);
fprintf
(
stderr
,
"Font: remote font list total len is [%d] Size is [%d] !.
\n
"
,
nxagentRemoteFontList
.
length
,
nxagentRemoteFontList
.
listSize
);
#endif
nxagentRemoteFontList
.
list
[
pos
]
->
status
=
status
;
nxagentRemoteFontList
.
length
++
;
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: remote font list added [%s] in position [%d] as %s !.
\n
"
,
name
,
pos
,
status
?
"OK"
:
"deleted"
);
fprintf
(
stderr
,
"Font: remote font list total len is [%d] Size is [%d] !.
\n
"
,
nxagentRemoteFontList
.
length
,
nxagentRemoteFontList
.
listSize
);
#endif
}
static
void
nxagentFreeRemoteFontList
(
nxagentFontList
*
listRec
)
{
for
(
int
l
=
0
;
l
<
listRec
->
length
;
l
++
)
{
if
(
listRec
->
list
[
l
])
for
(
int
l
=
0
;
l
<
listRec
->
length
;
l
++
)
{
SAFE_free
(
listRec
->
list
[
l
]
->
name
);
SAFE_free
(
listRec
->
list
[
l
]);
if
(
listRec
->
list
[
l
])
{
SAFE_free
(
listRec
->
list
[
l
]
->
name
);
SAFE_free
(
listRec
->
list
[
l
]);
}
}
}
listRec
->
length
=
listRec
->
listSize
=
0
;
listRec
->
length
=
listRec
->
listSize
=
0
;
SAFE_free
(
listRec
->
list
);
SAFE_free
(
listRec
->
list
);
return
;
return
;
}
Bool
nxagentFontFind
(
const
char
*
name
,
int
*
pos
)
{
if
(
!
nxagentRemoteFontList
.
length
)
{
*
pos
=
0
;
return
False
;
}
int
low
=
0
;
int
high
=
nxagentRemoteFontList
.
length
-
1
;
int
iter
=
0
;
int
res
=
1
;
int
lpos
=
nxagentRemoteFontList
.
length
;
while
(
low
<=
high
)
{
*
pos
=
(
high
+
low
)
/
2
;
iter
++
;
res
=
strcasecmp
(
nxagentRemoteFontList
.
list
[
*
pos
]
->
name
,
name
);
if
(
res
>
0
)
{
high
=
*
pos
-
1
;
lpos
=
*
pos
;
continue
;
}
else
if
(
res
<
0
)
{
low
=
*
pos
+
1
;
lpos
=
low
;
continue
;
}
break
;
}
*
pos
=
(
res
==
0
)
?*
pos
:
lpos
;
#ifdef NXAGENT_FONTMATCH_DEBUG
if
(
res
==
0
)
fprintf
(
stderr
,
"Font: font found in %d iterations in pos = %d
\n
"
,
iter
,
*
pos
);
else
fprintf
(
stderr
,
"Font: not font found in %d iterations insertion pos is = %d
\n
"
,
iter
,
*
pos
);
#endif
return
(
res
==
0
);
if
(
!
nxagentRemoteFontList
.
length
)
{
*
pos
=
0
;
return
False
;
}
int
low
=
0
;
int
high
=
nxagentRemoteFontList
.
length
-
1
;
int
iter
=
0
;
int
res
=
1
;
int
lpos
=
nxagentRemoteFontList
.
length
;
while
(
low
<=
high
)
{
*
pos
=
(
high
+
low
)
/
2
;
iter
++
;
res
=
strcasecmp
(
nxagentRemoteFontList
.
list
[
*
pos
]
->
name
,
name
);
if
(
res
>
0
)
{
high
=
*
pos
-
1
;
lpos
=
*
pos
;
continue
;
}
else
if
(
res
<
0
)
{
low
=
*
pos
+
1
;
lpos
=
low
;
continue
;
}
break
;
}
*
pos
=
(
res
==
0
)
?
*
pos
:
lpos
;
#ifdef NXAGENT_FONTMATCH_DEBUG
if
(
res
==
0
)
fprintf
(
stderr
,
"Font: font found in %d iterations in pos = %d
\n
"
,
iter
,
*
pos
);
else
fprintf
(
stderr
,
"Font: not font found in %d iterations insertion pos is = %d
\n
"
,
iter
,
*
pos
);
#endif
return
(
res
==
0
);
}
Bool
nxagentFontLookUp
(
const
char
*
name
)
{
int
i
;
int
i
;
if
(
name
!=
NULL
&&
strlen
(
name
)
==
0
)
{
return
0
;
}
if
(
name
&&
strlen
(
name
)
==
0
)
{
return
0
;
}
int
result
=
nxagentFontFind
(
name
,
&
i
);
int
result
=
nxagentFontFind
(
name
,
&
i
);
char
*
scalable
=
NULL
;
char
*
scalable
=
NULL
;
/*
* Let's try with the scalable font description.
*/
/*
* Let's try with the scalable font description.
*/
if
(
result
==
0
)
{
if
((
scalable
=
nxagentMakeScalableFontName
(
name
,
0
))
!=
NULL
)
if
(
result
==
0
)
{
result
=
nxagentFontFind
(
scalable
,
&
i
);
if
((
scalable
=
nxagentMakeScalableFontName
(
name
,
0
))
!=
NULL
)
{
result
=
nxagentFontFind
(
scalable
,
&
i
);
SAFE_free
(
scalable
);
SAFE_free
(
scalable
);
}
}
}
/*
* Let's try again after replacing zero to xdpi and ydpi in the pattern.
*/
/*
* Let's try again after replacing zero to xdpi and ydpi in the pattern.
*/
if
(
result
==
0
)
{
if
((
scalable
=
nxagentMakeScalableFontName
(
name
,
1
))
!=
NULL
)
if
(
result
==
0
)
{
result
=
nxagentFontFind
(
scalable
,
&
i
);
if
((
scalable
=
nxagentMakeScalableFontName
(
name
,
1
))
!=
NULL
)
{
result
=
nxagentFontFind
(
scalable
,
&
i
);
SAFE_free
(
scalable
);
SAFE_free
(
scalable
);
}
}
}
if
(
result
==
0
)
{
return
0
;
}
else
{
return
(
nxagentRemoteFontList
.
list
[
i
]
->
status
>
0
);
}
if
(
result
==
0
)
{
return
0
;
}
else
{
return
(
nxagentRemoteFontList
.
list
[
i
]
->
status
>
0
);
}
}
Bool
nxagentRealizeFont
(
ScreenPtr
pScreen
,
FontPtr
pFont
)
{
void
*
priv
;
Atom
name_atom
,
value_atom
;
int
nprops
;
FontPropPtr
props
;
int
i
;
const
char
*
name
;
char
*
origName
=
(
char
*
)
pScreen
;
#ifdef HAS_XFONT2
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
#else
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
#endif
/* HAS_XFONT2 */
name_atom
=
MakeAtom
(
"FONT"
,
4
,
True
);
value_atom
=
0L
;
Atom
name_atom
=
MakeAtom
(
"FONT"
,
4
,
True
);
Atom
value_atom
=
0L
;
nprops
=
pFont
->
info
.
nprops
;
props
=
pFont
->
info
.
props
;
int
nprops
=
pFont
->
info
.
nprops
;
FontPropPtr
props
=
pFont
->
info
.
props
;
for
(
i
=
0
;
i
<
nprops
;
i
++
)
if
((
Atom
)
props
[
i
].
name
==
name_atom
)
{
value_atom
=
props
[
i
].
value
;
break
;
for
(
int
i
=
0
;
i
<
nprops
;
i
++
)
{
if
((
Atom
)
props
[
i
].
name
==
name_atom
)
{
value_atom
=
props
[
i
].
value
;
break
;
}
}
if
(
!
value_atom
)
return
False
;
if
(
!
value_atom
)
return
False
;
name
=
NameForAtom
(
value_atom
);
const
char
*
name
=
NameForAtom
(
value_atom
);
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentRealizeFont, realizing font: %s
\n
"
,
validateString
(
name
));
fprintf
(
stderr
,
" atom: %ld
\n
"
,
value_atom
);
fprintf
(
stderr
,
"Font: Cache dump:
\n
"
);
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
fprintf
(
stderr
,
"nxagentFontCache.entry[%d]->name: %s font_struct at %p
\n
"
,
i
,
CACHE_NAME
(
i
),
CACHE_FSTRUCT
(
i
));
}
#endif
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentRealizeFont, realizing font: %s
\n
"
,
validateString
(
name
));
fprintf
(
stderr
,
" atom: %ld
\n
"
,
value_atom
);
fprintf
(
stderr
,
"Font: Cache dump:
\n
"
);
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
fprintf
(
stderr
,
"nxagentFontCache.entry[%d]->name: %s font_struct at %p
\n
"
,
i
,
CACHE_NAME
(
i
),
CACHE_FSTRUCT
(
i
));
}
#endif
if
(
!
name
)
return
False
;
if
(
!
name
)
return
False
;
if
((
strcasecmp
(
origName
,
name
)
!=
0
)
&&
!
strchr
(
origName
,
'*'
))
{
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Changing font name to realize from [%s] to [%s]
\n
"
,
validateString
(
name
),
origName
);
#endif
char
*
origName
=
(
char
*
)
pScreen
;
if
((
strcasecmp
(
origName
,
name
)
!=
0
)
&&
!
strchr
(
origName
,
'*'
))
{
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Changing font name to realize from [%s] to [%s]
\n
"
,
validateString
(
name
),
origName
);
#endif
name
=
origName
;
}
name
=
origName
;
}
priv
=
(
void
*
)
malloc
(
sizeof
(
nxagentPrivFont
));
void
*
priv
=
(
void
*
)
malloc
(
sizeof
(
nxagentPrivFont
));
#ifdef HAS_XFONT2
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
priv
);
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
priv
);
#else
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
priv
);
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
priv
);
#endif
/* HAS_XFONT2 */
nxagentFontPriv
(
pFont
)
->
mirrorID
=
0
;
nxagentFontPriv
(
pFont
)
->
mirrorID
=
0
;
for
(
i
=
0
;
i
<
nxagentFontCache
.
index
;
i
++
)
{
/* if (value_atom == CACHE_ATOM(i))*/
if
(
strcasecmp
(
CACHE_NAME
(
i
),
name
)
==
0
)
{
int
fci
;
for
(
fci
=
0
;
fci
<
nxagentFontCache
.
index
;
fci
++
)
{
/* if (value_atom == CACHE_ATOM(i))*/
if
(
strcasecmp
(
CACHE_NAME
(
fci
),
name
)
==
0
)
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentFontCache hit [%s] = [%s]!
\n
"
,
CACHE_NAME
(
fci
),
validateString
(
name
));
#endif
break
;
}
}
if
(
fci
<
CACHE_INDEX
)
{
nxagentFontPriv
(
pFont
)
->
font_struct
=
CACHE_FSTRUCT
(
fci
);
strcpy
(
nxagentFontPriv
(
pFont
)
->
fontName
,
name
);
}
else
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentFontCache
hit [%s] = [%s]!
\n
"
,
CACHE_NAME
(
i
),
validateString
(
name
)
);
fprintf
(
stderr
,
"Font: nxagentFontCache
fail.
\n
"
);
#endif
break
;
}
}
if
(
CACHE_INDEX
==
CACHE_SIZE
)
{
/* FIXME: if realloc fails the pointer is lost */
CACHE_ENTRY_PTR
=
realloc
(
CACHE_ENTRY_PTR
,
sizeof
(
nxCacheFontEntryRecPtr
)
*
(
CACHE_SIZE
+
100
));
if
(
i
<
CACHE_INDEX
)
{
nxagentFontPriv
(
pFont
)
->
font_struct
=
CACHE_FSTRUCT
(
i
);
strcpy
(
nxagentFontPriv
(
pFont
)
->
fontName
,
name
);
}
else
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentFontCache fail.
\n
"
);
#endif
if
(
CACHE_ENTRY_PTR
==
NULL
)
{
FatalError
(
"Font: Cache list memory re-allocation failed.
\n
"
);
}
if
(
CACHE_INDEX
==
CACHE_SIZE
)
{
CACHE_ENTRY_PTR
=
realloc
(
CACHE_ENTRY_PTR
,
sizeof
(
nxCacheFontEntryRecPtr
)
*
(
CACHE_SIZE
+
100
));
CACHE_SIZE
+=
100
;
}
if
(
CACHE_ENTRY_PTR
==
NULL
)
CACHE_ENTRY
(
CACHE_INDEX
)
=
malloc
(
sizeof
(
nxCacheFontEntryRec
));
if
(
CACHE_ENTRY
(
CACHE_INDEX
)
==
NULL
)
{
FatalError
(
"Font: Cache list memory re-allocation failed.
\n
"
)
;
return
False
;
}
CACHE_SIZE
+=
100
;
}
CACHE_NAME
(
CACHE_INDEX
)
=
malloc
(
strlen
(
name
)
+
1
);
CACHE_ENTRY
(
CACHE_INDEX
)
=
malloc
(
sizeof
(
nxCacheFontEntryRec
));
if
(
CACHE_NAME
(
CACHE_INDEX
)
==
NULL
)
{
return
False
;
}
if
(
CACHE_ENTRY
(
CACHE_INDEX
)
==
NULL
)
{
return
False
;
}
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Going to realize font [%s],[%s] on real X server.
\n
"
,
validateString
(
name
),
origName
);
#endif
CACHE_NAME
(
CACHE_INDEX
)
=
malloc
(
strlen
(
name
)
+
1
);
if
(
nxagentRemoteFontList
.
length
==
0
&&
(
NXDisplayError
(
nxagentDisplay
)
==
0
))
{
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
);
}
if
(
CACHE_NAME
(
CACHE_INDEX
)
==
NULL
)
{
return
False
;
}
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Font: Going to realize font [%s],[%s] on real X server.
\n
"
,
validateString
(
name
),
origName
);
#endif
if
(
nxagentRemoteFontList
.
length
==
0
&&
(
NXDisplayError
(
nxagentDisplay
)
==
0
))
{
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
);
}
nxagentFontPriv
(
pFont
)
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
(
char
*
)
name
,
pFont
);
strcpy
(
nxagentFontPriv
(
pFont
)
->
fontName
,
name
);
if
(
nxagentFontPriv
(
pFont
)
->
font_struct
!=
NULL
)
{
CACHE_ATOM
(
i
)
=
value_atom
;
strcpy
(
CACHE_NAME
(
i
),
name
);
CACHE_FSTRUCT
(
i
)
=
nxagentFontPriv
(
pFont
)
->
font_struct
;
CACHE_INDEX
++
;
nxagentFontPriv
(
pFont
)
->
mirrorID
=
FakeClientID
(
serverClient
->
index
);
AddResource
(
nxagentFontPriv
(
pFont
)
->
mirrorID
,
RT_NX_FONT
,
pFont
);
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentFontCache adds font [%s] in pos. [%d].
\n
"
,
validateString
(
name
),
CACHE_INDEX
-
1
);
#endif
}
}
nxagentFontPriv
(
pFont
)
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
(
char
*
)
name
,
pFont
);
strcpy
(
nxagentFontPriv
(
pFont
)
->
fontName
,
name
);
if
(
nxagentFontPriv
(
pFont
)
->
font_struct
!=
NULL
)
{
CACHE_ATOM
(
fci
)
=
value_atom
;
strcpy
(
CACHE_NAME
(
fci
),
name
);
CACHE_FSTRUCT
(
fci
)
=
nxagentFontPriv
(
pFont
)
->
font_struct
;
CACHE_INDEX
++
;
nxagentFontPriv
(
pFont
)
->
mirrorID
=
FakeClientID
(
serverClient
->
index
);
AddResource
(
nxagentFontPriv
(
pFont
)
->
mirrorID
,
RT_NX_FONT
,
pFont
);
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"Font: nxagentFontCache adds font [%s] in pos. [%d].
\n
"
,
validateString
(
name
),
CACHE_INDEX
-
1
);
#endif
}
}
#ifdef NXAGENT_FONTMATCH_DEBUG
#ifdef NXAGENT_FONTMATCH_DEBUG
if
(
nxagentFontPriv
(
pFont
)
->
font_struct
==
NULL
)
{
if
(
nxagentFontLookUp
(
name
)
==
False
)
if
(
nxagentFontPriv
(
pFont
)
->
font_struct
==
NULL
)
{
fprintf
(
stderr
,
"Font: nxagentRealizeFont failed with font Font=%s, not in our remote list
\n
"
,
validateString
(
name
));
if
(
nxagentFontLookUp
(
name
)
==
False
)
{
fprintf
(
stderr
,
"Font: nxagentRealizeFont failed with font Font=%s, not in our remote list
\n
"
,
validateString
(
name
));
}
else
{
fprintf
(
stderr
,
"Font: nxagentRealizeFont failed with font Font=%s but the font is in our remote list
\n
"
,
validateString
(
name
));
}
}
else
{
fprintf
(
stderr
,
"Font: nxagentRealizeFont failed with font Font=%s but the font is in our remote list
\n
"
,
validateString
(
name
));
fprintf
(
stderr
,
"Font: nxagentRealizeFont OK realizing font Font=%s
\n
"
,
validateString
(
name
));
}
}
else
fprintf
(
stderr
,
"Font: nxagentRealizeFont OK realizing font Font=%s
\n
"
,
validateString
(
name
));
#endif
#endif
return
(
nxagentFontPriv
(
pFont
)
->
font_struct
!=
NULL
);
return
(
nxagentFontPriv
(
pFont
)
->
font_struct
!=
NULL
);
}
Bool
nxagentUnrealizeFont
(
ScreenPtr
pScreen
,
FontPtr
pFont
)
{
if
(
nxagentFontPriv
(
pFont
))
{
if
(
NXDisplayError
(
nxagentDisplay
)
==
0
)
if
(
nxagentFontPriv
(
pFont
))
{
if
(
nxagentFontStruct
(
pFont
))
{
int
i
;
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
CACHE_FSTRUCT
(
i
)
==
nxagentFontStruct
(
pFont
))
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"nxagentUnrealizeFont: Not freeing the font in cache.
\n
"
);
#endif
break
;
}
}
if
(
i
==
CACHE_INDEX
)
{
/*
* This font is not in the cache.
*/
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"nxagentUnrealizeFont: Freeing font not found in cache '%d'
\n
"
,
CACHE_ATOM
(
i
));
#endif
XFreeFont
(
nxagentDisplay
,
nxagentFontStruct
(
pFont
));
}
}
}
if
(
NXDisplayError
(
nxagentDisplay
)
==
0
)
{
if
(
nxagentFontStruct
(
pFont
))
{
int
fci
;
for
(
fci
=
0
;
fci
<
CACHE_INDEX
;
fci
++
)
{
if
(
CACHE_FSTRUCT
(
fci
)
==
nxagentFontStruct
(
pFont
))
{
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"nxagentUnrealizeFont: Not freeing the font in cache.
\n
"
);
#endif
break
;
}
}
if
(
fci
==
CACHE_INDEX
)
{
/*
* This font is not in the cache.
*/
#ifdef NXAGENT_FONTCACHE_DEBUG
fprintf
(
stderr
,
"nxagentUnrealizeFont: Freeing font not found in cache '%d'
\n
"
,
CACHE_ATOM
(
fci
));
#endif
XFreeFont
(
nxagentDisplay
,
nxagentFontStruct
(
pFont
));
}
}
}
if
(
nxagentFontPriv
(
pFont
)
->
mirrorID
)
FreeResource
(
nxagentFontPriv
(
pFont
)
->
mirrorID
,
RT_NONE
);
if
(
nxagentFontPriv
(
pFont
)
->
mirrorID
)
FreeResource
(
nxagentFontPriv
(
pFont
)
->
mirrorID
,
RT_NONE
);
free
(
nxagentFontPriv
(
pFont
));
free
(
nxagentFontPriv
(
pFont
));
#ifdef HAS_XFONT2
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
xfont2_font_set_private
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
#else
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
FontSetPrivate
(
pFont
,
nxagentFontPrivateIndex
,
NULL
);
#endif
/* HAS_XFONT2 */
}
}
return
True
;
return
True
;
}
int
nxagentDestroyNewFontResourceType
(
void
*
p
,
XID
id
)
{
#ifdef TEST
fprintf
(
stderr
,
"%s: Destroying mirror id [%ld] for font at [%p].
\n
"
,
__func__
,
nxagentFontPriv
((
FontPtr
)
p
)
->
mirrorID
,
(
void
*
)
p
);
#endif
#ifdef TEST
fprintf
(
stderr
,
"%s: Destroying mirror id [%ld] for font at [%p].
\n
"
,
__func__
,
nxagentFontPriv
((
FontPtr
)
p
)
->
mirrorID
,
(
void
*
)
p
);
#endif
/*
FIXME: It happens that this resource had been already destroyed. We
...
...
@@ -684,12 +686,12 @@ FIXME: It happens that this resource had been already destroyed. We
client and another client. We had a crash when freeing server
client resources.
*/
if
(
nxagentFontPriv
((
FontPtr
)
p
)
!=
NULL
)
{
nxagentFontPriv
((
FontPtr
)
p
)
->
mirrorID
=
None
;
}
if
(
nxagentFontPriv
((
FontPtr
)
p
)
!=
NULL
)
{
nxagentFontPriv
((
FontPtr
)
p
)
->
mirrorID
=
None
;
}
return
1
;
return
1
;
}
static
XFontStruct
*
nxagentLoadBestQueryFont
(
Display
*
dpy
,
char
*
fontName
,
FontPtr
pFont
)
...
...
@@ -722,7 +724,7 @@ static XFontStruct *nxagentLoadBestQueryFont(Display* dpy, char *fontName, FontP
5
,
/* Set-width */
8
,
/* Point size */
10
/* DPI_y */
};
};
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: Searching font '%s' .
\n
"
,
fontName
);
...
...
@@ -734,71 +736,69 @@ static XFontStruct *nxagentLoadBestQueryFont(Display* dpy, char *fontName, FontP
if
(
numFontFields
<=
FIELDS
)
{
#ifdef WARNING
if
(
nxagentVerbose
==
1
)
{
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: WARNING! Font name in non standard format.
\n
"
);
}
#endif
#ifdef WARNING
if
(
nxagentVerbose
==
1
)
{
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: WARNING! Font name in non standard format.
\n
"
);
}
#endif
}
else
{
for
(
int
i
=
1
;
i
<
nxagentRemoteFontList
.
length
;
i
++
)
{
numSearchFields
=
nxagentSplitString
(
nxagentRemoteFontList
.
list
[
i
]
->
name
,
searchFields
,
FIELDS
+
1
,
"-"
);
/* The following code attempts to find an accurate approximation
* of the missing font. The current candidate and the missing font are
* compared on the 14 fields of the X Logical Font Description Convention.
* The selection is performed by the analysis of the matching fields,
* shifting left the value of the Weight variable on the right matches
* and shifting right the value of the Weight on the wrong ones;
* due a probability of overmuch right shifting, the starting weight is set
* to a high value. At the end of matching the selected font is the one
* with the bigger final Weight. The shift operation has been used instead
* of other operation for a performance issue.
* In some check the shift is performed by more than one position, because
* of the relevance of the field; for example a correct slant or a matching
* charset is more relevant than the size.
*/
if
(
numSearchFields
>
FIELDS
)
for
(
int
i
=
1
;
i
<
nxagentRemoteFontList
.
length
;
i
++
)
{
tempWeight
=
0
;
for
(
int
j
=
0
;
j
<
FIELDS
;
j
++
)
{
if
(
strcasecmp
(
searchFields
[
fieldOrder
[
j
]],
fontNameFields
[
fieldOrder
[
j
]])
==
0
||
strcmp
(
searchFields
[
fieldOrder
[
j
]],
""
)
==
0
||
strcmp
(
fontNameFields
[
fieldOrder
[
j
]],
""
)
!=
0
||
strcmp
(
searchFields
[
fieldOrder
[
j
]],
"*"
)
==
0
||
strcmp
(
fontNameFields
[
fieldOrder
[
j
]],
"*"
)
==
0
)
numSearchFields
=
nxagentSplitString
(
nxagentRemoteFontList
.
list
[
i
]
->
name
,
searchFields
,
FIELDS
+
1
,
"-"
);
/* The following code attempts to find an accurate approximation
* of the missing font. The current candidate and the missing font are
* compared on the 14 fields of the X Logical Font Description Convention.
* The selection is performed by the analysis of the matching fields,
* shifting left the value of the Weight variable on the right matches
* and shifting right the value of the Weight on the wrong ones;
* due a probability of overmuch right shifting, the starting weight is set
* to a high value. At the end of matching the selected font is the one
* with the bigger final Weight. The shift operation has been used instead
* of other operation for a performance issue.
* In some check the shift is performed by more than one position, because
* of the relevance of the field; for example a correct slant or a matching
* charset is more relevant than the size.
*/
if
(
numSearchFields
>
FIELDS
)
{
tempWeight
++
;
}
tempWeight
<<=
1
;
}
tempWeight
=
0
;
for
(
int
j
=
0
;
j
<
FIELDS
;
j
++
)
{
if
(
strcasecmp
(
searchFields
[
fieldOrder
[
j
]],
fontNameFields
[
fieldOrder
[
j
]])
==
0
||
strcmp
(
searchFields
[
fieldOrder
[
j
]],
""
)
==
0
||
strcmp
(
fontNameFields
[
fieldOrder
[
j
]],
""
)
!=
0
||
strcmp
(
searchFields
[
fieldOrder
[
j
]],
"*"
)
==
0
||
strcmp
(
fontNameFields
[
fieldOrder
[
j
]],
"*"
)
==
0
)
{
tempWeight
++
;
}
tempWeight
<<=
1
;
}
}
if
(
tempWeight
>
weight
)
{
/* Found more accurate font */
/* Found more accurate font */
weight
=
tempWeight
;
snprintf
(
substFontBuf
,
sizeof
(
substFontBuf
),
"%s"
,
nxagentRemoteFontList
.
list
[
i
]
->
name
);
weight
=
tempWeight
;
snprintf
(
substFontBuf
,
sizeof
(
substFontBuf
),
"%s"
,
nxagentRemoteFontList
.
list
[
i
]
->
name
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: Weight '%d' of more accurate font '%s' .
\n
"
,
weight
,
substFontBuf
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: Weight '%d' of more accurate font '%s' .
\n
"
,
weight
,
substFontBuf
);
#endif
}
for
(
int
j
=
0
;
j
<
numSearchFields
;
j
++
)
{
SAFE_free
(
searchFields
[
j
]);
SAFE_free
(
searchFields
[
j
]);
}
}
}
...
...
@@ -806,8 +806,8 @@ static XFontStruct *nxagentLoadBestQueryFont(Display* dpy, char *fontName, FontP
#ifdef WARNING
if
(
nxagentVerbose
==
1
)
{
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: WARNING! Failed to load font '%s'. Replacing with '%s'.
\n
"
,
fontName
,
substFontBuf
);
fprintf
(
stderr
,
"nxagentLoadBestQueryFont: WARNING! Failed to load font '%s'. Replacing with '%s'.
\n
"
,
fontName
,
substFontBuf
);
}
#endif
...
...
@@ -815,7 +815,7 @@ static XFontStruct *nxagentLoadBestQueryFont(Display* dpy, char *fontName, FontP
for
(
int
j
=
0
;
j
<
numFontFields
;
j
++
)
{
SAFE_free
(
fontNameFields
[
j
]);
SAFE_free
(
fontNameFields
[
j
]);
}
return
fontStruct
;
...
...
@@ -837,16 +837,16 @@ static void nxagentFontDisconnect(FontPtr pFont, XID param1, void * param2)
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontDisconnect: font %s found in cache at position %d
\n
"
,
privFont
->
fontName
,
i
);
#endif
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontDisconnect: font %s found in cache at position %d
\n
"
,
privFont
->
fontName
,
i
);
#endif
privFont
->
font_struct
=
NULL
;
return
;
}
privFont
->
font_struct
=
NULL
;
return
;
}
}
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
...
...
@@ -856,888 +856,883 @@ static void nxagentFontDisconnect(FontPtr pFont, XID param1, void * param2)
if
(
privFont
->
font_struct
)
{
XFreeFont
(
nxagentDisplay
,
privFont
->
font_struct
);
privFont
->
font_struct
=
NULL
;
XFreeFont
(
nxagentDisplay
,
privFont
->
font_struct
);
privFont
->
font_struct
=
NULL
;
}
}
static
void
nxagentCollectFailedFont
(
FontPtr
fpt
,
XID
id
)
{
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
)
{
nxagentFailedToReconnectFonts
.
size
=
8
;
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
)
{
nxagentFailedToReconnectFonts
.
size
=
8
;
nxagentFailedToReconnectFonts
.
font
=
malloc
(
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
FontPtr
));
nxagentFailedToReconnectFonts
.
font
=
malloc
(
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
FontPtr
));
nxagentFailedToReconnectFonts
.
id
=
malloc
(
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
XID
));
nxagentFailedToReconnectFonts
.
id
=
malloc
(
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
XID
));
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
||
nxagentFailedToReconnectFonts
.
id
==
NULL
)
{
SAFE_free
(
nxagentFailedToReconnectFonts
.
font
);
SAFE_free
(
nxagentFailedToReconnectFonts
.
id
);
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
||
nxagentFailedToReconnectFonts
.
id
==
NULL
)
{
SAFE_free
(
nxagentFailedToReconnectFonts
.
font
);
SAFE_free
(
nxagentFailedToReconnectFonts
.
id
);
FatalError
(
"Font: font not reconnected memory allocation failed!.
\n
"
);
}
FatalError
(
"Font: font not reconnected memory allocation failed!.
\n
"
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: allocated [%d] bytes.
\n
"
,
8
*
(
sizeof
(
FontPtr
)
+
sizeof
(
XID
)));
#endif
}
else
if
(
nxagentFailedToReconnectFonts
.
index
==
nxagentFailedToReconnectFonts
.
size
-
1
)
{
nxagentFailedToReconnectFonts
.
size
*=
2
;
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: allocated [%d] bytes.
\n
"
,
8
*
(
sizeof
(
FontPtr
)
+
sizeof
(
XID
)));
#endif
}
else
if
(
nxagentFailedToReconnectFonts
.
index
==
nxagentFailedToReconnectFonts
.
size
-
1
)
{
nxagentFailedToReconnectFonts
.
size
*=
2
;
/* FIXME: if realloc fails the pointer is lost */
nxagentFailedToReconnectFonts
.
font
=
realloc
(
nxagentFailedToReconnectFonts
.
font
,
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
FontPtr
));
nxagentFailedToReconnectFonts
.
font
=
realloc
(
nxagentFailedToReconnectFonts
.
font
,
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
FontPtr
));
nxagentFailedToReconnectFonts
.
id
=
realloc
(
nxagentFailedToReconnectFonts
.
id
,
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
XID
));
nxagentFailedToReconnectFonts
.
id
=
realloc
(
nxagentFailedToReconnectFonts
.
id
,
nxagentFailedToReconnectFonts
.
size
*
sizeof
(
XID
));
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
||
nxagentFailedToReconnectFonts
.
id
==
NULL
)
{
FatalError
(
"Font: font not reconnected memory re-allocation failed!.
\n
"
);
}
if
(
nxagentFailedToReconnectFonts
.
font
==
NULL
||
nxagentFailedToReconnectFonts
.
id
==
NULL
)
{
FatalError
(
"Font: font not reconnected memory re-allocation failed!.
\n
"
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: reallocated memory.
\n
"
);
#endif
}
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: reallocated memory.
\n
"
);
#endif
}
nxagentFailedToReconnectFonts
.
font
[
nxagentFailedToReconnectFonts
.
index
]
=
fpt
;
nxagentFailedToReconnectFonts
.
font
[
nxagentFailedToReconnectFonts
.
index
]
=
fpt
;
nxagentFailedToReconnectFonts
.
id
[
nxagentFailedToReconnectFonts
.
index
]
=
id
;
nxagentFailedToReconnectFonts
.
id
[
nxagentFailedToReconnectFonts
.
index
]
=
id
;
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: font not reconnected at [%p], "
"put in nxagentFailedToReconnectFonts.font[%d] = [%p], with XID = [%lu].
\n
"
,
(
void
*
)
fpt
,
nxagentFailedToReconnectFonts
.
index
,
(
void
*
)
nxagentFailedToReconnectFonts
.
font
[
nxagentFailedToReconnectFonts
.
index
],
nxagentFailedToReconnectFonts
.
id
[
nxagentFailedToReconnectFonts
.
index
]);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentCollectFailedFont: font not reconnected at [%p], "
"put in nxagentFailedToReconnectFonts.font[%d] = [%p], with XID = [%lu].
\n
"
,
(
void
*
)
fpt
,
nxagentFailedToReconnectFonts
.
index
,
(
void
*
)
nxagentFailedToReconnectFonts
.
font
[
nxagentFailedToReconnectFonts
.
index
],
nxagentFailedToReconnectFonts
.
id
[
nxagentFailedToReconnectFonts
.
index
]);
#endif
nxagentFailedToReconnectFonts
.
index
++
;
nxagentFailedToReconnectFonts
.
index
++
;
}
static
void
nxagentFontReconnect
(
FontPtr
pFont
,
XID
param1
,
void
*
param2
)
{
int
i
;
Bool
*
pBool
=
(
Bool
*
)
param2
;
int
i
;
Bool
*
pBool
=
(
Bool
*
)
param2
;
if
(
pFont
==
NULL
)
return
;
if
(
pFont
==
NULL
)
return
;
nxagentPrivFont
*
privFont
=
nxagentFontPriv
(
pFont
);
nxagentPrivFont
*
privFont
=
nxagentFontPriv
(
pFont
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: pFont %p - XID %lx - name %s
\n
"
,
(
void
*
)
pFont
,
(
privFont
->
font_struct
)
?
nxagentFont
(
pFont
)
:
0
,
privFont
->
fontName
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: pFont %p - XID %lx - name %s
\n
"
,
(
void
*
)
pFont
,
(
privFont
->
font_struct
)
?
nxagentFont
(
pFont
)
:
0
,
privFont
->
fontName
);
#endif
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
found in cache"
);
#endif
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
found in cache"
);
#endif
if
(
!
CACHE_FSTRUCT
(
i
))
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
" --- font struct not valid
\n
"
);
#endif
if
(
!
CACHE_FSTRUCT
(
i
))
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
" --- font struct not valid
\n
"
);
#endif
break
;
}
break
;
}
nxagentFontStruct
(
pFont
)
=
CACHE_FSTRUCT
(
i
);
nxagentFontStruct
(
pFont
)
=
CACHE_FSTRUCT
(
i
);
return
;
return
;
}
}
}
if
(
i
==
CACHE_INDEX
)
{
FatalError
(
"nxagentFontReconnect: font not found in cache."
);
}
if
(
i
==
CACHE_INDEX
)
{
FatalError
(
"nxagentFontReconnect: font not found in cache."
);
}
privFont
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
privFont
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
if
((
privFont
->
font_struct
==
NULL
)
&&
reconnectFlexibility
)
{
privFont
->
font_struct
=
nxagentLoadBestQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
}
if
((
privFont
->
font_struct
==
NULL
)
&&
reconnectFlexibility
)
{
privFont
->
font_struct
=
nxagentLoadBestQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
}
if
(
privFont
->
font_struct
!=
NULL
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
XID %lx
\n
"
,
privFont
->
font_struct
->
fid
);
#endif
if
(
privFont
->
font_struct
!=
NULL
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
XID %lx
\n
"
,
privFont
->
font_struct
->
fid
);
#endif
CACHE_FSTRUCT
(
i
)
=
privFont
->
font_struct
;
}
else
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: failed
\n
"
);
#endif
CACHE_FSTRUCT
(
i
)
=
privFont
->
font_struct
;
}
else
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: failed
\n
"
);
#endif
nxagentCollectFailedFont
(
pFont
,
param1
);
nxagentCollectFailedFont
(
pFont
,
param1
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: reconnection of font [%s] failed.
\n
"
,
privFont
->
fontName
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFontReconnect: reconnection of font [%s] failed.
\n
"
,
privFont
->
fontName
);
#endif
nxagentSetReconnectError
(
FAILED_RESUME_FONTS_ALERT
,
"Couldn't restore the font '%s'"
,
privFont
->
fontName
);
nxagentSetReconnectError
(
FAILED_RESUME_FONTS_ALERT
,
"Couldn't restore the font '%s'"
,
privFont
->
fontName
);
*
pBool
=
False
;
}
*
pBool
=
False
;
}
return
;
return
;
}
static
void
nxagentFreeCacheBeforeReconnect
(
void
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
printFontCacheDump
(
"nxagentFreeCacheBeforeReconnect"
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
printFontCacheDump
(
"nxagentFreeCacheBeforeReconnect"
);
#endif
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
CACHE_FSTRUCT
(
i
))
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
nxagentFreeFont
(
CACHE_FSTRUCT
(
i
));
CACHE_FSTRUCT
(
i
)
=
NULL
;
if
(
CACHE_FSTRUCT
(
i
))
{
nxagentFreeFont
(
CACHE_FSTRUCT
(
i
));
CACHE_FSTRUCT
(
i
)
=
NULL
;
}
}
}
}
static
void
nxagentCleanCacheAfterReconnect
(
void
)
{
int
real_size
=
CACHE_INDEX
;
int
real_size
=
CACHE_INDEX
;
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
printFontCacheDump
(
"nxagentCleanCacheAfterReconnect"
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
printFontCacheDump
(
"nxagentCleanCacheAfterReconnect"
);
#endif
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
CACHE_FSTRUCT
(
i
)
==
NULL
)
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
SAFE_XFree
(
CACHE_NAME
(
i
));
real_size
--
;
if
(
CACHE_FSTRUCT
(
i
)
==
NULL
)
{
SAFE_XFree
(
CACHE_NAME
(
i
));
real_size
--
;
}
}
}
for
(
int
i
=
0
;
i
<
real_size
;
i
++
)
{
int
j
;
nxCacheFontEntryRecPtr
swapEntryPtr
;
for
(
int
i
=
0
;
i
<
real_size
;
i
++
)
{
int
j
;
nxCacheFontEntryRecPtr
swapEntryPtr
;
/* Find - first bad occurrence if exist. */
while
((
i
<
real_size
)
&&
CACHE_FSTRUCT
(
i
))
i
++
;
/* Find - first bad occurrence if exist. */
while
((
i
<
real_size
)
&&
CACHE_FSTRUCT
(
i
))
i
++
;
/* Really nothing more to do. */
if
(
i
==
real_size
)
break
;
/* Really nothing more to do. */
if
(
i
==
real_size
)
break
;
/*
* Find - first good occurrence (moving backward from right end) entry in
* order to replace the bad one.
*/
for
(
j
=
CACHE_INDEX
-
1
;
CACHE_FSTRUCT
(
j
)
==
NULL
;
j
--
);
/*
* Now we can swap the two entry and reduce the Cache index
*/
swapEntryPtr
=
CACHE_ENTRY
(
i
);
CACHE_ENTRY
(
i
)
=
CACHE_ENTRY
(
j
);
CACHE_ENTRY
(
j
)
=
swapEntryPtr
;
}
/*
* Find - first good occurrence (moving backward from right end) entry in
* order to replace the bad one.
*/
for
(
j
=
CACHE_INDEX
-
1
;
CACHE_FSTRUCT
(
j
)
==
NULL
;
j
--
);
/*
* Now we can swap the two entry and reduce the Cache index
*/
swapEntryPtr
=
CACHE_ENTRY
(
i
);
CACHE_ENTRY
(
i
)
=
CACHE_ENTRY
(
j
);
CACHE_ENTRY
(
j
)
=
swapEntryPtr
;
}
CACHE_INDEX
=
real_size
;
CACHE_INDEX
=
real_size
;
}
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
static
void
printFontCacheDump
(
char
*
msg
)
{
fprintf
(
stderr
,
"%s - begin -
\n
"
,
msg
);
fprintf
(
stderr
,
"%s - begin -
\n
"
,
msg
);
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
CACHE_FSTRUCT
(
i
))
{
fprintf
(
stderr
,
"
\t
XID %lx - %s
\n
"
,
CACHE_FSTRUCT
(
i
)
->
fid
,
CACHE_NAME
(
i
));
}
else
for
(
int
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
fprintf
(
stderr
,
"
\t
destroyed - %s
\n
"
,
CACHE_NAME
(
i
));
if
(
CACHE_FSTRUCT
(
i
))
{
fprintf
(
stderr
,
"
\t
XID %lx - %s
\n
"
,
CACHE_FSTRUCT
(
i
)
->
fid
,
CACHE_NAME
(
i
));
}
else
{
fprintf
(
stderr
,
"
\t
destroyed - %s
\n
"
,
CACHE_NAME
(
i
));
}
}
}
fprintf
(
stderr
,
"%s - end -
\n
"
,
msg
);
fprintf
(
stderr
,
"%s - end -
\n
"
,
msg
);
}
#endif
Bool
nxagentReconnectAllFonts
(
void
*
p0
)
{
Bool
fontSuccess
=
True
;
Bool
fontSuccess
=
True
;
reconnectFlexibility
=
*
((
int
*
)
p0
);
reconnectFlexibility
=
*
((
int
*
)
p0
);
#if defined(NXAGENT_RECONNECT_DEBUG) || defined(NXAGENT_RECONNECT_FONT_DEBUG)
fprintf
(
stderr
,
"nxagentReconnectAllFonts
\n
"
);
#endif
#if defined(NXAGENT_RECONNECT_DEBUG) || defined(NXAGENT_RECONNECT_FONT_DEBUG)
fprintf
(
stderr
,
"nxagentReconnectAllFonts
\n
"
);
#endif
/*
* The resource type RT_NX_FONT is created on the server client
* only, so we can avoid to loop through all the clients.
*/
/*
* The resource type RT_NX_FONT is created on the server client
* only, so we can avoid to loop through all the clients.
*/
FindClientResourcesByType
(
clients
[
serverClient
->
index
],
RT_NX_FONT
,
(
FindResType
)
nxagentFontReconnect
,
&
fontSuccess
);
FindClientResourcesByType
(
clients
[
serverClient
->
index
],
RT_NX_FONT
,
(
FindResType
)
nxagentFontReconnect
,
&
fontSuccess
);
for
(
int
cid
=
0
;
cid
<
MAXCLIENTS
;
cid
++
)
{
if
(
clients
[
cid
])
for
(
int
cid
=
0
;
cid
<
MAXCLIENTS
;
cid
++
)
{
FindClientResourcesByType
(
clients
[
cid
],
RT_FONT
,
(
FindResType
)
nxagentFontReconnect
,
&
fontSuccess
);
if
(
clients
[
cid
])
{
FindClientResourcesByType
(
clients
[
cid
],
RT_FONT
,
(
FindResType
)
nxagentFontReconnect
,
&
fontSuccess
);
}
}
}
if
(
fontSuccess
)
{
nxagentCleanCacheAfterReconnect
();
}
if
(
fontSuccess
)
{
nxagentCleanCacheAfterReconnect
();
}
return
fontSuccess
;
return
fontSuccess
;
}
static
void
nxagentFailedFontReconnect
(
FontPtr
pFont
,
XID
param1
,
void
*
param2
)
{
int
i
;
nxagentPrivFont
*
privFont
;
Bool
*
pBool
=
(
Bool
*
)
param2
;
int
i
;
Bool
*
pBool
=
(
Bool
*
)
param2
;
if
(
pFont
==
NULL
)
return
;
if
(
pFont
==
NULL
)
return
;
privFont
=
nxagentFontPriv
(
pFont
);
nxagentPrivFont
*
privFont
=
nxagentFontPriv
(
pFont
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: pFont %p - XID %lx - name %s
\n
"
,
(
void
*
)
pFont
,
(
privFont
->
font_struct
)
?
nxagentFont
(
pFont
)
:
0
,
privFont
->
fontName
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: pFont %p - XID %lx - name %s
\n
"
,
(
void
*
)
pFont
,
(
privFont
->
font_struct
)
?
nxagentFont
(
pFont
)
:
0
,
privFont
->
fontName
);
#endif
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
for
(
i
=
0
;
i
<
CACHE_INDEX
;
i
++
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
found in cache"
);
#endif
if
(
strcasecmp
(
CACHE_NAME
(
i
),
privFont
->
fontName
)
==
0
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
found in cache"
);
#endif
if
(
!
CACHE_FSTRUCT
(
i
))
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
" --- font struct not valid
\n
"
);
#endif
if
(
!
CACHE_FSTRUCT
(
i
))
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
" --- font struct not valid
\n
"
);
#endif
break
;
}
break
;
}
nxagentFontStruct
(
pFont
)
=
CACHE_FSTRUCT
(
i
);
nxagentFontStruct
(
pFont
)
=
CACHE_FSTRUCT
(
i
);
return
;
return
;
}
}
}
if
(
i
==
CACHE_INDEX
)
{
FatalError
(
"nxagentFailedFontReconnect: font not found in cache."
);
}
if
(
i
==
CACHE_INDEX
)
{
FatalError
(
"nxagentFailedFontReconnect: font not found in cache."
);
}
privFont
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
privFont
->
font_struct
=
nxagentLoadQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
if
(
privFont
->
font_struct
==
NULL
)
{
privFont
->
font_struct
=
nxagentLoadBestQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
}
if
(
privFont
->
font_struct
==
NULL
)
{
privFont
->
font_struct
=
nxagentLoadBestQueryFont
(
nxagentDisplay
,
privFont
->
fontName
,
pFont
);
}
if
(
privFont
->
font_struct
!=
NULL
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
XID %lx
\n
"
,
privFont
->
font_struct
->
fid
);
#endif
if
(
privFont
->
font_struct
!=
NULL
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"
\t
XID %lx
\n
"
,
privFont
->
font_struct
->
fid
);
#endif
CACHE_FSTRUCT
(
i
)
=
privFont
->
font_struct
;
}
else
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: failed
\n
"
);
#endif
CACHE_FSTRUCT
(
i
)
=
privFont
->
font_struct
;
}
else
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: failed
\n
"
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: reconnection of font [%s] failed.
\n
"
,
privFont
->
fontName
);
#endif
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentFailedFontReconnect: reconnection of font [%s] failed.
\n
"
,
privFont
->
fontName
);
#endif
nxagentSetReconnectError
(
FAILED_RESUME_FONTS_ALERT
,
"Couldn't restore the font '%s'"
,
privFont
->
fontName
);
nxagentSetReconnectError
(
FAILED_RESUME_FONTS_ALERT
,
"Couldn't restore the font '%s'"
,
privFont
->
fontName
);
*
pBool
=
False
;
}
*
pBool
=
False
;
}
return
;
return
;
}
static
void
nxagentFreeFailedToReconnectFonts
(
void
)
{
SAFE_free
(
nxagentFailedToReconnectFonts
.
font
);
SAFE_free
(
nxagentFailedToReconnectFonts
.
id
);
SAFE_free
(
nxagentFailedToReconnectFonts
.
font
);
SAFE_free
(
nxagentFailedToReconnectFonts
.
id
);
nxagentFailedToReconnectFonts
.
size
=
0
;
nxagentFailedToReconnectFonts
.
index
=
0
;
nxagentFailedToReconnectFonts
.
size
=
0
;
nxagentFailedToReconnectFonts
.
index
=
0
;
}
Bool
nxagentReconnectFailedFonts
(
void
*
p0
)
{
int
attempt
=
1
;
const
int
maxAttempt
=
5
;
char
**
fontPaths
,
**
localFontPaths
,
**
newFontPaths
;
char
fontServerPath
[
256
]
=
""
;
int
nPaths
=
0
;
Bool
repeat
=
True
;
Bool
fontSuccess
=
True
;
reconnectFlexibility
=
*
((
int
*
)
p0
);
char
fontServerPath
[
256
]
=
""
;
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentReconnectFailedFonts:
\n
"
);
#endif
reconnectFlexibility
=
*
((
int
*
)
p0
);
if
(
nxagentGetFontServerPath
(
fontServerPath
,
sizeof
(
fontServerPath
))
==
False
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentReconnectFailedFonts: WARNING! "
"Font server tunneling not retrieved.
\n
"
);
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentReconnectFailedFonts:
\n
"
);
#endif
}
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentReconnectFailedFonts: font server path [%s]
\n
"
,
fontServerPath
);
#endif
fontPaths
=
XGetFontPath
(
nxagentDisplay
,
&
nPaths
);
if
((
newFontPaths
=
malloc
((
nPaths
+
1
)
*
sizeof
(
char
*
)))
==
NULL
)
{
FatalError
(
"nxagentReconnectFailedFonts: malloc failed."
);
}
memcpy
(
newFontPaths
,
fontPaths
,
nPaths
*
sizeof
(
char
*
));
localFontPaths
=
newFontPaths
;
localFontPaths
+=
nPaths
;
*
localFontPaths
=
fontServerPath
;
if
(
nxagentGetFontServerPath
(
fontServerPath
,
sizeof
(
fontServerPath
))
==
False
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentReconnectFailedFonts: WARNING! "
"Font server tunneling not retrieved.
\n
"
);
#endif
}
while
(
repeat
)
{
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentReconnectFailedFonts:
attempt [%d].
\n
"
,
attempt
);
fprintf
(
stderr
,
"nxagentReconnectFailedFonts:
font server path [%s]
\n
"
,
fontServerPath
);
#endif
repeat
=
False
;
int
nPaths
=
0
;
char
**
fontPaths
=
XGetFontPath
(
nxagentDisplay
,
&
nPaths
);
char
**
newFontPaths
=
malloc
((
nPaths
+
1
)
*
sizeof
(
char
*
));
XSetFontPath
(
nxagentDisplay
,
newFontPaths
,
nPaths
+
1
);
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
);
if
(
newFontPaths
==
NULL
)
{
FatalError
(
"nxagentReconnectFailedFonts: malloc failed."
);
}
for
(
int
i
=
0
;
i
<
nxagentFailedToReconnectFonts
.
index
;
i
++
)
memcpy
(
newFontPaths
,
fontPaths
,
nPaths
*
sizeof
(
char
*
));
char
**
localFontPaths
=
newFontPaths
;
localFontPaths
+=
nPaths
;
*
localFontPaths
=
fontServerPath
;
int
attempt
=
1
;
const
int
maxAttempt
=
5
;
Bool
repeat
=
True
;
while
(
repeat
)
{
fontSuccess
=
True
;
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentReconnectFailedFonts: attempt [%d].
\n
"
,
attempt
);
#endif
if
(
nxagentFailedToReconnectFonts
.
font
[
i
])
{
nxagentFailedFontReconnect
(
nxagentFailedToReconnectFonts
.
font
[
i
],
nxagentFailedToReconnectFonts
.
id
[
i
],
&
fontSuccess
);
repeat
=
False
;
if
(
fontSuccess
)
{
nxagentFailedToReconnectFonts
.
font
[
i
]
=
NULL
;
}
else
XSetFontPath
(
nxagentDisplay
,
newFontPaths
,
nPaths
+
1
);
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
)
;
for
(
int
i
=
0
;
i
<
nxagentFailedToReconnectFonts
.
index
;
i
++
)
{
repeat
=
True
;
Bool
fontSuccess
=
True
;
if
(
nxagentFailedToReconnectFonts
.
font
[
i
])
{
nxagentFailedFontReconnect
(
nxagentFailedToReconnectFonts
.
font
[
i
],
nxagentFailedToReconnectFonts
.
id
[
i
],
&
fontSuccess
);
if
(
fontSuccess
)
{
nxagentFailedToReconnectFonts
.
font
[
i
]
=
NULL
;
}
else
{
repeat
=
True
;
}
}
}
}
}
attempt
++
;
attempt
++
;
if
(
attempt
>
maxAttempt
)
{
nxagentFreeFailedToReconnectFonts
();
if
(
attempt
>
maxAttempt
)
{
nxagentFreeFailedToReconnectFonts
();
XSetFontPath
(
nxagentDisplay
,
fontPaths
,
nPaths
);
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
);
XSetFontPath
(
nxagentDisplay
,
fontPaths
,
nPaths
);
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentListRemoteFonts
(
"*"
,
nxagentMaxFontNames
);
XFreeFontPath
(
fontPaths
);
SAFE_free
(
newFontPaths
);
XFreeFontPath
(
fontPaths
);
SAFE_free
(
newFontPaths
);
return
False
;
return
False
;
}
}
}
nxagentFreeFailedToReconnectFonts
();
nxagentFreeFailedToReconnectFonts
();
XSetFontPath
(
nxagentDisplay
,
fontPaths
,
nPaths
);
XSetFontPath
(
nxagentDisplay
,
fontPaths
,
nPaths
);
XFreeFontPath
(
fontPaths
);
SAFE_free
(
newFontPaths
);
XFreeFontPath
(
fontPaths
);
SAFE_free
(
newFontPaths
);
nxagentCleanCacheAfterReconnect
();
nxagentCleanCacheAfterReconnect
();
return
True
;
return
True
;
}
Bool
nxagentDisconnectAllFonts
(
void
)
{
Bool
fontSuccess
=
True
;
Bool
fontSuccess
=
True
;
#if defined(NXAGENT_RECONNECT_DEBUG) || defined(NXAGENT_RECONNECT_FONT_DEBUG)
fprintf
(
stderr
,
"nxagentDisconnectAllFonts
\n
"
);
#endif
#if defined(NXAGENT_RECONNECT_DEBUG) || defined(NXAGENT_RECONNECT_FONT_DEBUG)
fprintf
(
stderr
,
"nxagentDisconnectAllFonts
\n
"
);
#endif
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentFreeCacheBeforeReconnect
();
nxagentFreeRemoteFontList
(
&
nxagentRemoteFontList
);
nxagentFreeCacheBeforeReconnect
();
/*
* The resource type RT_NX_FONT is created on the server client
* only, so we can avoid to loop through all the clients.
*/
/*
* The resource type RT_NX_FONT is created on the server client
* only, so we can avoid to loop through all the clients.
*/
FindClientResourcesByType
(
clients
[
serverClient
->
index
],
RT_NX_FONT
,
(
FindResType
)
nxagentFontDisconnect
,
&
fontSuccess
);
FindClientResourcesByType
(
clients
[
serverClient
->
index
],
RT_NX_FONT
,
(
FindResType
)
nxagentFontDisconnect
,
&
fontSuccess
);
for
(
int
cid
=
0
;
cid
<
MAXCLIENTS
;
cid
++
)
{
if
(
clients
[
cid
]
&&
fontSuccess
)
for
(
int
cid
=
0
;
cid
<
MAXCLIENTS
;
cid
++
)
{
FindClientResourcesByType
(
clients
[
cid
],
RT_FONT
,
(
FindResType
)
nxagentFontDisconnect
,
&
fontSuccess
);
if
(
clients
[
cid
]
&&
fontSuccess
)
{
FindClientResourcesByType
(
clients
[
cid
],
RT_FONT
,
(
FindResType
)
nxagentFontDisconnect
,
&
fontSuccess
);
}
}
}
return
True
;
return
True
;
}
static
Bool
nxagentGetFontServerPath
(
char
*
fontServerPath
,
int
size
)
{
char
path
[
256
]
=
{
0
};
if
(
NXGetFontParameters
(
nxagentDisplay
,
sizeof
(
path
),
path
)
==
True
)
{
/* the length is stored in the first byte and is therefore limited to 255 */
unsigned
int
len
=
*
path
;
char
path
[
256
]
=
{
0
};
if
(
len
)
if
(
NXGetFontParameters
(
nxagentDisplay
,
sizeof
(
path
),
path
)
==
True
)
{
snprintf
(
fontServerPath
,
min
(
size
,
len
+
1
),
"%s"
,
path
+
1
);
/* the length is stored in the first byte and is therefore limited to 255 */
unsigned
int
len
=
*
path
;
#ifdef TEST
fprintf
(
stderr
,
"%s: Got path [%s].
\n
"
,
__func__
,
fontServerPath
);
#endif
if
(
len
)
{
snprintf
(
fontServerPath
,
min
(
size
,
len
+
1
),
"%s"
,
path
+
1
);
#ifdef TEST
fprintf
(
stderr
,
"%s: Got path [%s].
\n
"
,
__func__
,
fontServerPath
);
#endif
}
else
{
#ifdef TEST
fprintf
(
stderr
,
"%s: WARNING! Font server tunneling not enabled.
\n
"
,
__func__
);
#endif
return
False
;
}
}
else
{
#ifdef TEST
fprintf
(
stderr
,
"%s: WARNING! Font server tunneling not enabled
.
\n
"
,
__func__
);
#endif
#ifdef TEST
fprintf
(
stderr
,
"%s: WARNING! Failed to get path for font server tunneling
.
\n
"
,
__func__
);
#endif
return
False
;
return
False
;
}
}
else
{
#ifdef TEST
fprintf
(
stderr
,
"%s: WARNING! Failed to get path for font server tunneling.
\n
"
,
__func__
);
#endif
return
False
;
}
return
True
;
return
True
;
}
void
nxagentVerifySingleFontPath
(
char
**
dest
,
const
char
*
fontDir
)
{
if
(
!
dest
||
!*
dest
)
return
;
if
(
!
dest
||
!*
dest
)
return
;
#ifdef TEST
fprintf
(
stderr
,
"%s: Assuming fonts in directory [%s].
\n
"
,
__func__
,
validateString
(
fontDir
));
#endif
#ifdef TEST
fprintf
(
stderr
,
"%s: Assuming fonts in directory [%s].
\n
"
,
__func__
,
validateString
(
fontDir
));
#endif
for
(
int
i
=
0
;
;
i
++
)
{
char
*
tmppath
=
NULL
;
int
rc
;
for
(
int
i
=
0
;
;
i
++
)
{
char
*
tmppath
=
NULL
;
int
rc
;
const
char
*
subdir
=
nxagentFontSubdirs
[
i
];
const
char
*
subdir
=
nxagentFontSubdirs
[
i
];
if
(
subdir
==
NULL
)
return
;
if
(
subdir
==
NULL
)
return
;
if
(
**
dest
!=
'\0'
)
{
rc
=
asprintf
(
&
tmppath
,
"%s,%s/%s"
,
*
dest
,
fontDir
,
subdir
);
}
else
{
rc
=
asprintf
(
&
tmppath
,
"%s/%s"
,
fontDir
,
subdir
);
}
if
(
**
dest
!=
'\0'
)
{
rc
=
asprintf
(
&
tmppath
,
"%s,%s/%s"
,
*
dest
,
fontDir
,
subdir
);
}
else
{
rc
=
asprintf
(
&
tmppath
,
"%s/%s"
,
fontDir
,
subdir
);
}
if
(
rc
==
-
1
)
return
;
if
(
rc
==
-
1
)
return
;
SAFE_free
(
*
dest
);
*
dest
=
tmppath
;
tmppath
=
NULL
;
}
SAFE_free
(
*
dest
);
*
dest
=
tmppath
;
tmppath
=
NULL
;
}
}
void
nxagentVerifyDefaultFontPath
(
void
)
{
static
char
*
fontPath
;
static
char
*
fontPath
;
#ifdef TEST
fprintf
(
stderr
,
"%s: Going to search for one or more valid font paths.
\n
"
,
__func__
);
#endif
/*
* Set the default font path as the first choice.
*/
if
((
fontPath
=
strdup
(
defaultFontPath
))
==
NULL
)
{
#ifdef WARNING
fprintf
(
stderr
,
"%s: WARNING! Unable to allocate memory for a new font path. "
"Using the default font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#ifdef TEST
fprintf
(
stderr
,
"%s: Going to search for one or more valid font paths.
\n
"
,
__func__
);
#endif
return
;
}
for
(
int
i
=
0
;
;
i
++
)
{
int
j
;
const
char
*
dir
=
nxagentFontDirs
[
i
];
/*
* Set the default font path as the first choice.
*/
if
(
dir
==
NULL
)
if
(
(
fontPath
=
strdup
(
defaultFontPath
))
==
NULL
)
{
break
;
#ifdef WARNING
fprintf
(
stderr
,
"%s: WARNING! Unable to allocate memory for a new font path. "
"Using the default font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#endif
return
;
}
else
for
(
int
i
=
0
;
;
i
++
)
{
for
(
j
=
0
;
j
<=
i
;
j
++
)
{
//if (strcmp(nxagentFontDirs[j], dir) == 0)
if
(
nxagentFontDirs
[
j
]
==
dir
)
int
j
;
const
char
*
dir
=
nxagentFontDirs
[
i
];
if
(
dir
==
NULL
)
{
break
;
break
;
}
}
if
(
j
==
i
)
{
nxagentVerifySingleFontPath
(
&
fontPath
,
dir
);
}
else
{
for
(
j
=
0
;
j
<=
i
;
j
++
)
{
//if (strcmp(nxagentFontDirs[j], dir) == 0)
if
(
nxagentFontDirs
[
j
]
==
dir
)
{
break
;
}
}
if
(
j
==
i
)
{
nxagentVerifySingleFontPath
(
&
fontPath
,
dir
);
}
#ifdef TEST
else
{
fprintf
(
stderr
,
"%s: Skipping duplicate font dir [%s].
\n
"
,
__func__
,
validateString
(
dir
));
}
else
{
fprintf
(
stderr
,
"%s: Skipping duplicate font dir [%s].
\n
"
,
__func__
,
validateString
(
dir
));
}
#endif
}
}
}
if
(
*
fontPath
==
'\0'
)
{
#ifdef WARNING
fprintf
(
stderr
,
"%s: WARNING! Can't find a valid font directory.
\n
"
,
__func__
);
fprintf
(
stderr
,
"%s: WARNING! Using font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#endif
}
else
{
/* do _not_ free defaultFontPath here - it's either set at compile time or
part of argv */
defaultFontPath
=
fontPath
;
if
(
*
fontPath
==
'\0'
)
{
#ifdef WARNING
fprintf
(
stderr
,
"%s: WARNING! Can't find a valid font directory.
\n
"
,
__func__
);
fprintf
(
stderr
,
"%s: WARNING! Using font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#endif
}
else
{
/* do _not_ free defaultFontPath here - it's either set at compile time or
part of argv */
defaultFontPath
=
fontPath
;
#ifdef TEST
fprintf
(
stderr
,
"%s: Using font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#endif
}
#ifdef TEST
fprintf
(
stderr
,
"%s: Using font path [%s].
\n
"
,
__func__
,
validateString
(
defaultFontPath
));
#endif
}
return
;
return
;
}
XFontStruct
*
nxagentLoadQueryFont
(
register
Display
*
dpy
,
char
*
name
,
FontPtr
pFont
)
{
XFontStruct
*
fs
;
xCharInfo
*
xcip
;
XFontStruct
*
fs
=
(
XFontStruct
*
)
malloc
(
sizeof
(
XFontStruct
));
fs
=
(
XFontStruct
*
)
malloc
(
sizeof
(
XFontStruct
));
if
(
fs
==
NULL
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Failed allocation of XFontStruct.
\n
"
);
#endif
if
(
fs
==
NULL
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Failed allocation of XFontStruct.
\n
"
);
#endif
return
(
XFontStruct
*
)
NULL
;
}
return
(
XFontStruct
*
)
NULL
;
}
#ifdef NXAGENT_RECONNECT_FONT_DEBUG
fprintf
(
stderr
,
"nxagentLoadQueryFont: Looking for font '%s'.
\n
"
,
name
);
#endif
if
(
nxagentFontLookUp
(
name
)
==
0
)
{
#ifdef DEBUG
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Font not found '%s'.
\n
"
,
name
);
#endif
if
(
nxagentFontLookUp
(
name
)
==
0
)
{
#ifdef DEBUG
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Font not found '%s'.
\n
"
,
name
);
#endif
SAFE_free
(
fs
);
SAFE_free
(
fs
);
return
(
XFontStruct
*
)
NULL
;
}
fs
->
ext_data
=
NULL
;
/* Hook for extension to hang data.*/
fs
->
fid
=
XLoadFont
(
dpy
,
name
);
/* Font id for this font. */
fs
->
direction
=
pFont
->
info
.
drawDirection
;
/* Hint about the direction font is painted. */
fs
->
min_char_or_byte2
=
pFont
->
info
.
firstCol
;
/* First character. */
fs
->
max_char_or_byte2
=
pFont
->
info
.
lastCol
;
/* Last character. */
fs
->
min_byte1
=
pFont
->
info
.
firstRow
;
/* First row that exists. */
fs
->
max_byte1
=
pFont
->
info
.
lastRow
;
/* Last row that exists. */
fs
->
all_chars_exist
=
pFont
->
info
.
allExist
;
/* Flag if all characters have nonzero size. */
fs
->
default_char
=
pFont
->
info
.
defaultCh
;
/* Char to print for undefined character. */
fs
->
n_properties
=
pFont
->
info
.
nprops
;
/* How many properties there are. */
/*
* If no properties defined for the font, then it is bad
* font, but shouldn't try to read nothing.
*/
return
(
XFontStruct
*
)
NULL
;
}
if
(
fs
->
n_properties
>
0
)
{
register
long
nbytes
;
fs
->
ext_data
=
NULL
;
/* Hook for extension to hang data.*/
fs
->
fid
=
XLoadFont
(
dpy
,
name
);
/* Font id for this font. */
fs
->
direction
=
pFont
->
info
.
drawDirection
;
/* Hint about the direction font is painted. */
fs
->
min_char_or_byte2
=
pFont
->
info
.
firstCol
;
/* First character. */
fs
->
max_char_or_byte2
=
pFont
->
info
.
lastCol
;
/* Last character. */
fs
->
min_byte1
=
pFont
->
info
.
firstRow
;
/* First row that exists. */
fs
->
max_byte1
=
pFont
->
info
.
lastRow
;
/* Last row that exists. */
fs
->
all_chars_exist
=
pFont
->
info
.
allExist
;
/* Flag if all characters have nonzero size. */
fs
->
default_char
=
pFont
->
info
.
defaultCh
;
/* Char to print for undefined character. */
fs
->
n_properties
=
pFont
->
info
.
nprops
;
/* How many properties there are. */
nbytes
=
pFont
->
info
.
nprops
*
sizeof
(
XFontProp
);
fs
->
properties
=
(
XFontProp
*
)
malloc
((
unsigned
)
nbytes
);
/*
* If no properties defined for the font, then it is bad
* font, but shouldn't try to read nothing.
*/
if
(
fs
->
properties
==
NULL
)
if
(
fs
->
n_properties
>
0
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Failed allocation of XFontProp."
);
#endif
long
nbytes
;
SAFE_free
(
fs
);
return
(
XFontStruct
*
)
NULL
;
}
nbytes
=
pFont
->
info
.
nprops
*
sizeof
(
XFontProp
);
fs
->
properties
=
(
XFontProp
*
)
malloc
((
unsigned
)
nbytes
);
memmove
(
fs
->
properties
,
pFont
->
info
.
props
,
nbytes
);
}
if
(
fs
->
properties
==
NULL
)
{
#ifdef WARNING
fprintf
(
stderr
,
"nxagentLoadQueryFont: WARNING! Failed allocation of XFontProp."
);
#endif
xcip
=
(
xCharInfo
*
)
&
pFont
->
info
.
ink_minbounds
;
SAFE_free
(
fs
);
return
(
XFontStruct
*
)
NULL
;
}
fs
->
min_bounds
.
lbearing
=
cvtINT16toShort
(
xcip
->
leftSideBearing
);
fs
->
min_bounds
.
rbearing
=
cvtINT16toShort
(
xcip
->
rightSideBearing
);
fs
->
min_bounds
.
width
=
cvtINT16toShort
(
xcip
->
characterWidth
);
fs
->
min_bounds
.
ascent
=
cvtINT16toShort
(
xcip
->
ascent
);
fs
->
min_bounds
.
descent
=
cvtINT16toShort
(
xcip
->
descent
);
fs
->
min_bounds
.
attributes
=
xcip
->
attributes
;
memmove
(
fs
->
properties
,
pFont
->
info
.
props
,
nbytes
);
}
xCharInfo
*
xcip
=
(
xCharInfo
*
)
&
pFont
->
info
.
ink_minbounds
;
fs
->
min_bounds
.
lbearing
=
cvtINT16toShort
(
xcip
->
leftSideBearing
);
fs
->
min_bounds
.
rbearing
=
cvtINT16toShort
(
xcip
->
rightSideBearing
);
fs
->
min_bounds
.
width
=
cvtINT16toShort
(
xcip
->
characterWidth
);
fs
->
min_bounds
.
ascent
=
cvtINT16toShort
(
xcip
->
ascent
);
fs
->
min_bounds
.
descent
=
cvtINT16toShort
(
xcip
->
descent
);
fs
->
min_bounds
.
attributes
=
xcip
->
attributes
;
xcip
=
(
xCharInfo
*
)
&
pFont
->
info
.
ink_maxbounds
;
xcip
=
(
xCharInfo
*
)
&
pFont
->
info
.
ink_maxbounds
;
fs
->
max_bounds
.
lbearing
=
cvtINT16toShort
(
xcip
->
leftSideBearing
);
fs
->
max_bounds
.
rbearing
=
cvtINT16toShort
(
xcip
->
rightSideBearing
);
fs
->
max_bounds
.
width
=
cvtINT16toShort
(
xcip
->
characterWidth
);
fs
->
max_bounds
.
ascent
=
cvtINT16toShort
(
xcip
->
ascent
);
fs
->
max_bounds
.
descent
=
cvtINT16toShort
(
xcip
->
descent
);
fs
->
max_bounds
.
attributes
=
xcip
->
attributes
;
fs
->
max_bounds
.
lbearing
=
cvtINT16toShort
(
xcip
->
leftSideBearing
);
fs
->
max_bounds
.
rbearing
=
cvtINT16toShort
(
xcip
->
rightSideBearing
);
fs
->
max_bounds
.
width
=
cvtINT16toShort
(
xcip
->
characterWidth
);
fs
->
max_bounds
.
ascent
=
cvtINT16toShort
(
xcip
->
ascent
);
fs
->
max_bounds
.
descent
=
cvtINT16toShort
(
xcip
->
descent
);
fs
->
max_bounds
.
attributes
=
xcip
->
attributes
;
fs
->
per_char
=
NULL
;
/* First_char to last_char information. */
fs
->
ascent
=
pFont
->
info
.
fontAscent
;
/* Logical extent above baseline for spacing. */
fs
->
descent
=
pFont
->
info
.
fontDescent
;
/* Logical decent below baseline for spacing. */
fs
->
per_char
=
NULL
;
/* First_char to last_char information. */
fs
->
ascent
=
pFont
->
info
.
fontAscent
;
/* Logical extent above baseline for spacing. */
fs
->
descent
=
pFont
->
info
.
fontDescent
;
/* Logical decent below baseline for spacing. */
return
fs
;
return
fs
;
}
int
nxagentFreeFont
(
XFontStruct
*
fs
)
{
if
(
fs
->
per_char
)
{
#ifdef USE_XF86BIGFONT
_XF86BigfontFreeFontMetrics
(
fs
);
#else
SAFE_free
(
fs
->
per_char
);
#endif
}
if
(
fs
->
per_char
)
{
#ifdef USE_XF86BIGFONT
_XF86BigfontFreeFontMetrics
(
fs
);
#else
SAFE_free
(
fs
->
per_char
);
#endif
}
SAFE_free
(
fs
->
properties
);
SAFE_XFree
(
fs
);
SAFE_free
(
fs
->
properties
);
SAFE_XFree
(
fs
);
return
1
;
return
1
;
}
int
nxagentSplitString
(
char
*
string
,
char
*
fields
[],
int
nfields
,
char
*
sep
)
{
int
seplen
=
strlen
(
sep
);
int
len
=
strlen
(
string
);
int
seplen
=
strlen
(
sep
);
int
len
=
strlen
(
string
);
char
*
current
=
string
;
char
*
current
=
string
;
int
i
=
0
;
int
last
=
0
;
int
i
=
0
;
int
last
=
0
;
for
(;;)
{
char
*
next
=
NULL
;
if
(
current
<
string
+
len
)
for
(;;)
{
next
=
strstr
(
current
,
sep
);
}
char
*
next
=
NULL
;
if
(
next
==
NULL
)
{
next
=
string
+
len
;
last
=
1
;
}
if
(
current
<
string
+
len
)
{
next
=
strstr
(
current
,
sep
);
}
if
(
next
==
NULL
)
{
next
=
string
+
len
;
last
=
1
;
}
int
fieldlen
=
next
-
current
;
int
fieldlen
=
next
-
current
;
if
(
i
<
nfields
)
{
fields
[
i
]
=
strndup
(
current
,
fieldlen
);
}
else
{
fields
[
i
]
=
NULL
;
}
if
(
i
<
nfields
)
{
fields
[
i
]
=
strndup
(
current
,
fieldlen
);
}
else
{
fields
[
i
]
=
NULL
;
}
current
=
next
+
seplen
;
current
=
next
+
seplen
;
i
++
;
i
++
;
if
(
last
==
1
)
{
break
;
if
(
last
==
1
)
{
break
;
}
}
}
return
i
;
return
i
;
}
char
*
nxagentMakeScalableFontName
(
const
char
*
fontName
,
int
scalableResolution
)
{
char
*
scalableFontName
;
/* FIXME: use str(n)dup()? */
if
((
scalableFontName
=
malloc
(
strlen
(
fontName
)
+
1
))
==
NULL
)
{
#ifdef PANIC
fprintf
(
stderr
,
"nxagentMakeScalableFontName: PANIC! malloc() failed.
\n
"
);
#endif
char
*
scalableFontName
;
return
NULL
;
}
/* FIXME: use str(n)dup()? */
if
((
scalableFontName
=
malloc
(
strlen
(
fontName
)
+
1
))
==
NULL
)
{
#ifdef PANIC
fprintf
(
stderr
,
"nxagentMakeScalableFontName: PANIC! malloc() failed.
\n
"
);
#endif
scalableFontName
[
0
]
=
'\0'
;
return
NULL
;
}
if
(
*
fontName
!=
'-'
)
{
goto
MakeScalableFontNameError
;
}
scalableFontName
[
0
]
=
'\0'
;
const
char
*
s
=
fontName
;
if
(
*
fontName
!=
'-'
)
{
goto
MakeScalableFontNameError
;
}
int
field
=
0
;
const
char
*
s
=
fontName
;
while
(
s
!=
NULL
)
{
s
=
strchr
(
s
+
1
,
'-'
);
int
field
=
0
;
if
(
s
!=
NULL
)
while
(
s
!=
NULL
)
{
if
(
field
==
6
||
field
==
7
||
field
==
11
)
{
/*
* PIXEL_SIZE || POINT_SIZE || AVERAGE_WIDTH
*/
s
=
strchr
(
s
+
1
,
'-'
);
strcat
(
scalableFontName
,
"-0"
);
}
else
if
(
scalableResolution
==
1
&&
(
field
==
8
||
field
==
9
))
{
/*
* RESOLUTION_X || RESOLUTION_Y
*/
strcat
(
scalableFontName
,
"-0"
);
}
else
{
strncat
(
scalableFontName
,
fontName
,
s
-
fontName
);
}
if
(
s
!=
NULL
)
{
if
(
field
==
6
||
field
==
7
||
field
==
11
)
{
/*
* PIXEL_SIZE || POINT_SIZE || AVERAGE_WIDTH
*/
strcat
(
scalableFontName
,
"-0"
);
}
else
if
(
scalableResolution
==
1
&&
(
field
==
8
||
field
==
9
))
{
/*
* RESOLUTION_X || RESOLUTION_Y
*/
strcat
(
scalableFontName
,
"-0"
);
}
else
{
strncat
(
scalableFontName
,
fontName
,
s
-
fontName
);
}
fontName
=
s
;
}
else
{
strcat
(
scalableFontName
,
fontName
);
}
fontName
=
s
;
field
++
;
}
else
if
(
field
!=
14
)
{
strcat
(
scalableFontName
,
fontName
)
;
goto
MakeScalableFontNameError
;
}
field
++
;
}
if
(
field
!=
14
)
{
goto
MakeScalableFontNameError
;
}
return
scalableFontName
;
return
scalableFontName
;
MakeScalableFontNameError:
SAFE_free
(
scalableFontName
);
SAFE_free
(
scalableFontName
);
#ifdef DEBUG
fprintf
(
stderr
,
"nxagentMakeScalableFontName: Invalid font name.
\n
"
);
#endif
#ifdef DEBUG
fprintf
(
stderr
,
"nxagentMakeScalableFontName: Invalid font name.
\n
"
);
#endif
return
NULL
;
return
NULL
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment