[teklib-general] changeset in /hg/teklib/current: visuals now support fonts outsi...
Franciska Schulze
fschulze at neoscientists.org
Mon Nov 26 16:22:12 CET 2007
changeset fd2fc4502d44 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=fd2fc4502d44
description:
visuals now support fonts outside the scope of instances
diffs (truncated from 773 to 300 lines):
diff -r d9ec5cc029cb -r fd2fc4502d44 src/visual/posix/visual_host.c
--- a/src/visual/posix/visual_host.c Sun Sep 02 14:52:51 2007 +0200
+++ b/src/visual/posix/visual_host.c Sun Sep 02 18:44:44 2007 +0200
@@ -17,14 +17,6 @@
#include "visual_host.h"
static TBOOL shm_available;
-
-struct attrdata
-{
- TMOD_VIS *mod;
- VISUAL *v;
- TAPTR font;
- TINT num;
-};
/*****************************************************************************/
#define FNT_LENGTH 41 /* "-*-fname-medium-r-*-*-xxx-*-*-*-*-*-iso8859-1" */
@@ -42,9 +34,10 @@ struct FontNode
XFontStruct *font;
};
-static TAPTR
-openfont(TMOD_VIS *mod, VISUAL *v, TTAGITEM *tags)
-{
+LOCAL TAPTR
+vis_hostopenfont(TMOD_VIS *mod, TTAGITEM *tags)
+{
+ GLOBAL *g = mod->vis_HostGlobal;
TINT fpxsize;
TBOOL fitalic, fbold;
TAPTR font = TNULL;
@@ -77,12 +70,12 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
fn = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontNode));
if (fn)
{
- fn->font = XLoadQueryFont(v->display, fquery);
+ fn->font = XLoadQueryFont(g->display, fquery);
if (fn->font)
{
/* append to the list of open fonts */
TDBPRINTF(10, ("'%s' successfully loaded\n", fname));
- TAddTail(&v->fm.openfonts, &fn->node);
+ TAddTail(&g->fm.openfonts, &fn->node);
font = (TAPTR)fn;
}
else
@@ -91,8 +84,8 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
TDBPRINTF(10, ("unable to load '%s'\n", fname));
TDBPRINTF(10, ("defaulting to '%s'\n", DEFFONTNAME));
TExecFree(exec, fn);
- font = v->fm.deffont;
- v->fm.defref++;
+ font = g->fm.deffont;
+ g->fm.defref++;
}
}
@@ -103,42 +96,55 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
}
static TVOID
-setfont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
-{
+setfont(TMOD_VIS *mod, TAPTR font)
+{
+ VISUAL *v = mod->vis_HostVisual;
XGCValues gcv;
struct FontNode *fn = (struct FontNode *) font;
+
gcv.font = fn->font->fid;
XChangeGC(v->display, v->gc, GCFont, &gcv);
- v->fm.curfont = font;
-}
-
-static TVOID
-closefont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
-{
+ v->curfont = font;
+}
+
+LOCAL TVOID
+vis_hostclosefont(TMOD_VIS *mod, TAPTR font)
+{
+ GLOBAL *g = mod->vis_HostGlobal;
struct FontNode *fn = (struct FontNode *) font;
TAPTR exec = TGetExecBase(mod);
- if (font == v->fm.deffont)
- {
- if (v->fm.defref)
+ if (font == g->fm.deffont)
+ {
+ if (g->fm.defref)
{
/* prevent freeing of default font if it's */
/* still referenced */
- v->fm.defref--;
+ g->fm.defref--;
return;
}
}
else
{
- /* the font we're going to free is currently */
- /* in use -> replace it with the default font */
- if (font == v->fm.curfont)
- setfont(mod, v, v->fm.deffont);
+ struct TNode *node, *next;
+ node = g->vlist.tlh_Head;
+ for (; (next = node->tln_Succ); node = next)
+ {
+ /* the font we're going to free is currently */
+ /* in use -> replace it with the default font */
+ VISUAL *v = (VISUAL *) node;
+
+ if (font == v->curfont)
+ setfont(v->mod, g->fm.deffont);
+ }
}
/* free xfont */
if (fn->font)
- XFreeFont(v->display, fn->font);
+ {
+ XFreeFont(g->display, fn->font);
+ fn->font = TNULL;
+ }
/* remove from openfonts list */
TRemove(&fn->node);
@@ -147,8 +153,8 @@ closefont(TMOD_VIS *mod, VISUAL *v, TAPT
TExecFree(exec, fn);
}
-static TINT
-textsize(TMOD_VIS *mod, VISUAL *v, TAPTR font, TSTRPTR text)
+LOCAL TINT
+vis_hosttextsize(TMOD_VIS *mod, TAPTR font, TSTRPTR text)
{
TINT len;
struct FontNode *fn = (struct FontNode *) font;
@@ -156,8 +162,8 @@ textsize(TMOD_VIS *mod, VISUAL *v, TAPTR
return len;
}
-static THOOKENTRY TTAG
-getfattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
+LOCAL THOOKENTRY TTAG
+vis_hostgetfattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
{
struct attrdata *data = hook->thk_Data;
TTAGITEM *item = obj;
@@ -323,7 +329,7 @@ static TVOID
static TVOID
drawtext1(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
{
- XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
+ XFontStruct *f = ((struct FontNode *) v->curfont)->font;
XDrawString(v->display, v->window, v->gc,
x, y + f->ascent, (char *) text, len);
}
@@ -333,7 +339,7 @@ static TVOID
static TVOID
drawtext2(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
{
- XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
+ XFontStruct *f = ((struct FontNode *) v->curfont)->font;
XDrawImageString(v->display, v->window, v->gc,
x, y + f->ascent, (char *) text, len);
}
@@ -614,7 +620,7 @@ getattrfunc(struct THook *hook, TAPTR ob
{
struct attrdata *data = hook->thk_Data;
TTAGITEM *item = obj;
- VISUAL *v = data->v;
+ VISUAL *v = data->mod->vis_HostVisual;
switch (item->tti_Tag)
{
@@ -660,7 +666,7 @@ setattrfunc(struct THook *hook, TAPTR ob
{
struct attrdata *data = hook->thk_Data;
TTAGITEM *item = obj;
- VISUAL *v = data->v;
+ VISUAL *v = data->mod->vis_HostVisual;
switch (item->tti_Tag)
{
default:
@@ -698,7 +704,7 @@ LOCAL TVOID
LOCAL TVOID
vis_prepareimsg(TMOD_VIS *mod, TIMSG *imsg)
{
- VISUAL *v = mod->vis_HostSpecific;
+ VISUAL *v = mod->vis_HostVisual;
imsg->timsg_Qualifier = v->keyqual;
imsg->timsg_MouseX = v->mousex;
imsg->timsg_MouseY = v->mousey;
@@ -714,7 +720,7 @@ static TBOOL
static TBOOL
getnextevent(TMOD_VIS *mod, TIMSG *newimsg)
{
- VISUAL *v = mod->vis_HostSpecific;
+ VISUAL *v = mod->vis_HostVisual;
XEvent ev;
KeySym keysym;
@@ -1173,15 +1179,75 @@ getprops(TMOD_VIS *mod, VISUAL *v)
/*****************************************************************************/
-static const TUINT8 endiancheck[4] = { 0x11,0x22,0x33,0x44 };
-
LOCAL TBOOL
vis_init(TMOD_VIS *mod)
{
+ struct FontNode *fn;
+ TAPTR exec = TGetExecBase(mod);
+ GLOBAL *g = TExecAlloc0(exec, mod->vis_MMU, sizeof(GLOBAL));
+ if (g == TNULL) return TFALSE;
+
+ for (;;)
+ {
+ TInitList(&g->vlist);
+
+ g->display = XOpenDisplay(TNULL);
+ if (g->display == TNULL) break;
+
+ /* init fontmanager and default font */
+ TInitList(&g->fm.openfonts);
+
+ fn = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontNode));
+ if (fn == TNULL) break;
+
+ fn->font = XLoadQueryFont(g->display, DEFFONTNAME);
+ if (fn->font == TNULL)
+ {
+ TExecFree(exec, fn);
+ break;
+ }
+
+ TAddTail(&g->fm.openfonts, &fn->node);
+ g->fm.deffont = (TAPTR)fn;
+ //g->fm.curfont = (TAPTR)fn;
+
+ TDBPRINTF(20,("vis_init - mod: %p - global: %p\n", mod, g));
+ mod->vis_HostGlobal = g;
+ return TTRUE;
+ }
+
+ vis_exit(mod);
+ return TFALSE;
+}
+
+LOCAL TVOID
+vis_exit(TMOD_VIS *mod)
+{
+ TAPTR exec = TGetExecBase(mod);
+ GLOBAL *g = mod->vis_HostGlobal;
+
+ TDBPRINTF(20,("vis_exit - mod: %p - global: %p\n", mod, g));
+
+ if (g->fm.deffont)
+ vis_hostclosefont(mod, g->fm.deffont);
+
+ if (g->display)
+ XCloseDisplay(g->display);
+
+ TExecFree(exec, g);
+ mod->vis_HostGlobal = TNULL;
+}
+
+static const TUINT8 endiancheck[4] = { 0x11,0x22,0x33,0x44 };
+
+LOCAL TBOOL
+vis_open(TMOD_VIS *mod)
+{
+ GLOBAL *g = mod->vis_HostGlobal;
TAPTR exec = TGetExecBase(mod);
VISUAL *v = TExecAlloc0(exec, mod->vis_MMU, sizeof(VISUAL));
if (v == TNULL) return TFALSE;
- mod->vis_HostSpecific = v;
+ mod->vis_HostVisual = v;
TInitList(&v->imsgpool);
for (;;)
@@ -1191,7 +1257,9 @@ vis_init(TMOD_VIS *mod)
XGCValues gcv;
TUINT gcv_mask;
int pipefd[2];
- struct FontNode *fn;
+ struct FontNode *fn = g->fm.deffont;
+ v->curfont = fn;
+ g->fm.defref++;
v->HalBase = TExecGetHALBase(TGetExecBase(mod));
THALInitLock(v->HalBase, &v->lock);
@@ -1202,8 +1270,9 @@ vis_init(TMOD_VIS *mod)
v->sizehints = XAllocSizeHints();
if (v->sizehints == TNULL) break;
More information about the teklib-general
mailing list