summaryrefslogtreecommitdiff
path: root/core/launcher/libpreload/preload.cpp
blob: 10d8313589e65c17aa099f01b75996e39190ceeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

#define _GNU_SOURCE
//#define private public
//#define protected public

#include <qwsdecoration_qws.h>
#include <qcommonstyle.h>

//#include <qapplication.h>
//#include <qfont.h>

//class QStyle;
class QApplication;
class QFont;
//class QWSDecoration;

#include <dlfcn.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


typedef void ( *qapp_setstyle_t ) ( QStyle * );
typedef void ( *qapp_setdeco_t ) ( QWSDecoration * ); 
typedef void ( *qapp_setfont_t ) ( const QFont &, bool, const char * ); 


static int *opie_block_style_p = 0;

extern "C" {

static void *resolve_symbol ( const char *sym )
{
	void *adr = ::dlsym ( RTLD_NEXT, sym );

	if ( !adr )
		::fprintf ( stderr, "PANIC: Could not resolve symbol \"%s\"\n", sym );
		
	return adr;
}

extern void setStyle__12QApplicationP6QStyle ( QStyle *style )
{
	static qapp_setstyle_t qsetstyle = 0;

	if ( !qsetstyle )
		qsetstyle = (qapp_setstyle_t) resolve_symbol ( "setStyle__12QApplicationP6QStyle" );

	if ( !opie_block_style_p )
		opie_block_style_p = (int *) resolve_symbol ( "opie_block_style" );
	
	if ( !qsetstyle || ( opie_block_style_p && ( *opie_block_style_p & 0x01 )))
		delete style;
	else
		( *qsetstyle ) ( style );
}

extern void setFont__12QApplicationRC5QFontbPCc ( const QFont &fnt, bool informWidgets, const char * className )
{
	static qapp_setfont_t qsetfont = 0;

	if ( !qsetfont )
		qsetfont = (qapp_setfont_t) resolve_symbol ( "setFont__12QApplicationRC5QFontbPCc" );

	if ( !opie_block_style_p )
		opie_block_style_p = (int *) resolve_symbol ( "opie_block_style" );
	
	if ( qsetfont && !( opie_block_style_p && ( *opie_block_style_p & 0x02 )))
		( *qsetfont ) ( fnt, informWidgets, className );
}
	

extern void qwsSetDecoration__12QApplicationP13QWSDecoration ( QWSDecoration *deco )
{
	static qapp_setdeco_t qsetdeco = 0;

	if ( !qsetdeco )
		qsetdeco = (qapp_setdeco_t) resolve_symbol ( "qwsSetDecoration__12QApplicationP13QWSDecoration" );

	if ( !opie_block_style_p )
		opie_block_style_p = (int *) resolve_symbol ( "opie_block_style" );
	
	if ( !qsetdeco || ( opie_block_style_p && ( *opie_block_style_p & 0x04 )))
		delete deco;
	else
		( *qsetdeco ) ( deco );
}

}