From 5f11552ae34058d7f0db5c78812096352c639602 Mon Sep 17 00:00:00 2001
From: Michele Calgaro <michele.calgaro@yahoo.it>
Date: Tue, 20 Jan 2026 19:27:15 +0900
Subject: Add visibility attributes to library functions

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
---
 src/kvilib/config/kvi_settings.h            |  9 ++-
 src/kvilib/core/kvi_memmove.cpp             | 14 ++---
 src/kvilib/core/kvi_memmove.h               |  4 +-
 src/kvilib/core/kvi_qstring.cpp             | 88 ++++++++++++++---------------
 src/kvilib/ext/kvi_regchan.h                |  2 +-
 src/kvilib/tal/kvi_tal_popupmenu.cpp        |  4 ++
 src/kvirc/kernel/kvi_ipc.h                  |  2 +
 src/kvirc/kvs/kvi_kvs_hash.h                |  2 +-
 src/kvirc/module/kvi_module.h               | 39 +++++++------
 src/modules/dcc/requests.cpp                |  2 +-
 src/modules/editor/libkvieditor.cpp         |  4 +-
 src/modules/mircimport/libkvimircimport.cpp |  2 +-
 src/modules/setup/libkvisetup.cpp           |  4 +-
 13 files changed, 96 insertions(+), 80 deletions(-)

diff --git a/src/kvilib/config/kvi_settings.h b/src/kvilib/config/kvi_settings.h
index 283bbba5..beb87def 100644
--- a/src/kvilib/config/kvi_settings.h
+++ b/src/kvilib/config/kvi_settings.h
@@ -69,8 +69,13 @@
 		#endif
 	#endif
 
-	#define KVILIB_API
-	#define KVIRC_API
+	#ifdef __TDE_HAVE_GCC_VISIBILITY
+		#define KVILIB_API __attribute__ ((visibility("default")))
+		#define KVIRC_API  __attribute__ ((visibility("default")))
+	#else
+		#define KVILIB_API
+		#define KVIRC_API
+	#endif
 
 	#ifndef VERSION
 		#define VERSION "?.?.?"
diff --git a/src/kvilib/core/kvi_memmove.cpp b/src/kvilib/core/kvi_memmove.cpp
index 504cf6c8..1d477a26 100644
--- a/src/kvilib/core/kvi_memmove.cpp
+++ b/src/kvilib/core/kvi_memmove.cpp
@@ -37,7 +37,7 @@
 	#ifdef COMPILE_ix86_ASM
 
 
-		void *kvi_memmove(void * dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void *kvi_memmove(void * dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -98,7 +98,7 @@
 			return dst_ptr; //asm("   movl 8(%ebp),%eax"); <-- gcc will put that (AFTER THE OPTIMISATION PASS!)
 		}
 	
-		void *kvi_memmoveodd(void * dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void *kvi_memmoveodd(void * dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -169,7 +169,7 @@
 		//
 		//
 	
-		void *kvi_memmove(void *dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void *kvi_memmove(void *dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -188,7 +188,7 @@
 		    return dst_ptr;
 		}
 	
-		void *kvi_memmoveodd(void *dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void *kvi_memmoveodd(void *dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -216,7 +216,7 @@
 		    return dst_ptr;
 		}
 		
-		void kvi_fastmove(void *dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void kvi_fastmove(void *dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -226,7 +226,7 @@
 			while(len--)*dst++ = *src++;
 		}
 	
-		void kvi_fastmoveodd(void *dst_ptr,const void *src_ptr,int len)
+		KVILIB_API void kvi_fastmoveodd(void *dst_ptr,const void *src_ptr,int len)
 		{
 			__range_valid(dst_ptr);
 			__range_valid(src_ptr);
@@ -242,7 +242,7 @@
 
 	#endif // !COMPILE_ix86_ASM
 	
-	void kvi_memset(void *dst_ptr,char c,int len)
+	KVILIB_API void kvi_memset(void *dst_ptr,char c,int len)
 	{
 		__range_valid(dst_ptr);
 		__range_valid(len >= 0);
diff --git a/src/kvilib/core/kvi_memmove.h b/src/kvilib/core/kvi_memmove.h
index d1319a41..d04cd6f6 100644
--- a/src/kvilib/core/kvi_memmove.h
+++ b/src/kvilib/core/kvi_memmove.h
@@ -59,7 +59,7 @@
 
 			// WE WANT repnz; movsq\n"!!!
 
-			inline void kvi_fastmove(void * dst_ptr,const void *src_ptr,int len)
+			KVILIB_API inline void kvi_fastmove(void * dst_ptr,const void *src_ptr,int len)
 			{
 				__asm__ __volatile__(
 					"	cld\n"
@@ -77,7 +77,7 @@
 				);
 			}
 
-			inline void kvi_fastmoveodd(void * dst_ptr,const void *src_ptr,int len)
+			KVILIB_API inline void kvi_fastmoveodd(void * dst_ptr,const void *src_ptr,int len)
 			{
 				__asm__ __volatile__(
 					"	cld\n"
diff --git a/src/kvilib/core/kvi_qstring.cpp b/src/kvilib/core/kvi_qstring.cpp
index 829b673b..6f7e8f79 100644
--- a/src/kvilib/core/kvi_qstring.cpp
+++ b/src/kvilib/core/kvi_qstring.cpp
@@ -51,7 +51,7 @@ namespace KviTQString
 	// The global empty (and null) string
 	const TQString empty;
 
-	bool equalCSN(const TQString &sz1,const TQString &sz2,unsigned int len)
+	KVILIB_API bool equalCSN(const TQString &sz1,const TQString &sz2,unsigned int len)
 	{
 		if(len == 0)return true; // assume equal
 		const TQChar * c1 = sz1.unicode();
@@ -71,7 +71,7 @@ namespace KviTQString
 		return (c1 == c1e);
 	}
 
-	bool equalCIN(const TQString &sz1,const TQString &sz2,unsigned int len)
+	KVILIB_API bool equalCIN(const TQString &sz1,const TQString &sz2,unsigned int len)
 	{
 		if(len == 0)return true; // assume equal
 		const TQChar * c1 = sz1.unicode();
@@ -91,7 +91,7 @@ namespace KviTQString
 		return (c1 == c1e);
 	}
 
-	bool equalCSN(const TQString &sz1,const char * sz2,unsigned int len)
+	KVILIB_API bool equalCSN(const TQString &sz1,const char * sz2,unsigned int len)
 	{
 		if(len == 0)return true; // assume equal
 		const TQChar * c1 = sz1.unicode();
@@ -110,7 +110,7 @@ namespace KviTQString
 		return (c1 == c1e);
 	}
 
-	bool equalCIN(const TQString &sz1,const char * sz2,unsigned int len)
+	KVILIB_API bool equalCIN(const TQString &sz1,const char * sz2,unsigned int len)
 	{
 		if(len == 0)return true; // assume equal
 		const TQChar * c1 = sz1.unicode();
@@ -130,7 +130,7 @@ namespace KviTQString
 	}
 
 	// sz2 is assumed to be null terminated, sz1 is not!
-	bool equalCIN(const TQString &sz1,const TQChar *sz2,unsigned int len)
+	KVILIB_API bool equalCIN(const TQString &sz1,const TQChar *sz2,unsigned int len)
 	{
 		if(len == 0)return true; // assume equal
 		const TQChar * c1 = sz1.unicode();
@@ -149,7 +149,7 @@ namespace KviTQString
 		return (c1 == c1e);
 	}
 
-	TQString makeSizeReadable(size_t bytes)
+	KVILIB_API TQString makeSizeReadable(size_t bytes)
 	{
 		double size = bytes;
 		if(size<900)
@@ -173,7 +173,7 @@ namespace KviTQString
 		return TQString(__tr2qs("%1 TB")).arg(size,0,'f',3);
 	}
 
-	bool equalCS(const TQString &sz1,const TQString &sz2)
+	KVILIB_API bool equalCS(const TQString &sz1,const TQString &sz2)
 	{
 		if(sz1.length() != sz2.length())return false;
 
@@ -192,7 +192,7 @@ namespace KviTQString
 		return (c1 == c1e);
 	}
 
-	bool equalCI(const TQString &sz1,const TQString &sz2)
+	KVILIB_API bool equalCI(const TQString &sz1,const TQString &sz2)
 	{
 		if(sz1.length() != sz2.length())return false;
 
@@ -212,7 +212,7 @@ namespace KviTQString
 	}
 
 	// sz2 is assumed to be null terminated, sz1 is not!
-	bool equalCI(const TQString &sz1,const TQChar *sz2)
+	KVILIB_API bool equalCI(const TQString &sz1,const TQChar *sz2)
 	{
 		const TQChar * c1 = sz1.unicode();
 		const TQChar * c1e = c1 + sz1.length();
@@ -229,7 +229,7 @@ namespace KviTQString
 		return (c1 == c1e) && (!sz2->unicode());
 	}
 
-	bool equalCS(const TQString &sz1,const char * sz2)
+	KVILIB_API bool equalCS(const TQString &sz1,const char * sz2)
 	{
 		const TQChar * c1 = sz1.unicode();
 		const TQChar * c1e = c1 + sz1.length();
@@ -245,7 +245,7 @@ namespace KviTQString
 		return ((c1 == c1e) && (*sz2 == '\0'));
 	}
 
-	bool equalCI(const TQString &sz1,const char * sz2)
+	KVILIB_API bool equalCI(const TQString &sz1,const char * sz2)
 	{
 		const TQChar * c1 = sz1.unicode();
 		const TQChar * c1e = c1 + sz1.length();
@@ -261,7 +261,7 @@ namespace KviTQString
 		return ((c1 == c1e) && (*sz2 == '\0'));
 	}
 
-	int cmpCS(const TQString &sz1,const TQString &sz2)
+	KVILIB_API int cmpCS(const TQString &sz1,const TQString &sz2)
 	{
 		const TQChar * c1 = sz1.unicode();
 		const TQChar * c2 = sz2.unicode();
@@ -295,7 +295,7 @@ namespace KviTQString
 		return 0; // never here
 	}
 
-	int cmpCI(const TQString &sz1,const TQString &sz2)
+	KVILIB_API int cmpCI(const TQString &sz1,const TQString &sz2)
 	{
 		const TQChar * c1 = sz1.unicode();
 		const TQChar * c2 = sz2.unicode();
@@ -328,7 +328,7 @@ namespace KviTQString
 		return 0; // never here
 	}
 
-	int cmpCIN(const TQString &sz1,const TQString &sz2,unsigned int len)
+	KVILIB_API int cmpCIN(const TQString &sz1,const TQString &sz2,unsigned int len)
 	{
 		if(len == 0)return 0; // assume equal
 		unsigned int l1 = MY_MIN(len,sz1.length());
@@ -356,12 +356,12 @@ namespace KviTQString
 		return diff;
 	}
 
-	void ensureLastCharIs(TQString &szString,const TQChar &c)
+	KVILIB_API void ensureLastCharIs(TQString &szString,const TQChar &c)
 	{
 		if(!lastCharIs(szString,c))szString.append(c);
 	}
 
-	TQString getToken(TQString &szString,const TQChar &sep)
+	KVILIB_API TQString getToken(TQString &szString,const TQChar &sep)
 	{
 		unsigned int i=0;
 		while(i < szString.length())
@@ -387,7 +387,7 @@ namespace KviTQString
 		return ret;
 	}
 
-	void stripRightWhiteSpace(TQString &s)
+	KVILIB_API void stripRightWhiteSpace(TQString &s)
 	{
 		unsigned int iRemove = 0;
 		while(iRemove < s.length())
@@ -398,7 +398,7 @@ namespace KviTQString
 		if(iRemove > 0)s.remove(s.length() - iRemove,iRemove);
 	}
 
-	void stripRight(TQString &s,const TQChar &c)
+	KVILIB_API void stripRight(TQString &s,const TQChar &c)
 	{
 		unsigned int iRemove = 0;
 		while(iRemove < s.length())
@@ -409,7 +409,7 @@ namespace KviTQString
 		if(iRemove > 0)s.remove(s.length() - iRemove,iRemove);
 	}
 
-	void stripLeft(TQString &s,const TQChar &c)
+	KVILIB_API void stripLeft(TQString &s,const TQChar &c)
 	{
 		unsigned int iRemove = 0;
 		while(iRemove < s.length())
@@ -422,53 +422,53 @@ namespace KviTQString
 		if(iRemove > 0)s.remove(0,iRemove);
 	}
 
-	void detach(TQString &sz)
+	KVILIB_API void detach(TQString &sz)
 	{
 		sz.setLength(sz.length());
 	}
 
-	const TQChar * nullTerminatedArray(const TQString &sz)
+	KVILIB_API const TQChar * nullTerminatedArray(const TQString &sz)
 	{
 		//sz.setLength(sz.length()); // detach!
 		return (const TQChar *)sz.ucs2(); // MAY BE NULL!
 	}
 	
-	void appendNumber(TQString &s,double dReal)
+	KVILIB_API void appendNumber(TQString &s,double dReal)
 	{
 		char buffer[512];
 		::sprintf(buffer,"%f",dReal);
 		s.append(buffer);
 	}
 	
-	void appendNumber(TQString &s,int iInteger)
+	KVILIB_API void appendNumber(TQString &s,int iInteger)
 	{
 		char buffer[64];
 		::sprintf(buffer,"%d",iInteger);
 		s.append(buffer);
 	}
 
-	void appendNumber(TQString &s,kvi_i64_t iInteger)
+	KVILIB_API void appendNumber(TQString &s,kvi_i64_t iInteger)
 	{
 		char buffer[64];
 		::sprintf(buffer,"%ld",iInteger);
 		s.append(buffer);
 	}
 	
-	void appendNumber(TQString &s,kvi_u64_t uInteger)
+	KVILIB_API void appendNumber(TQString &s,kvi_u64_t uInteger)
 	{
 		char buffer[64];
 		::sprintf(buffer,"%lu",uInteger);
 		s.append(buffer);
 	}
 	
-	void appendNumber(TQString &s,unsigned int uInteger)
+	KVILIB_API void appendNumber(TQString &s,unsigned int uInteger)
 	{
 		char buffer[64];
 		::sprintf(buffer,"%u",uInteger);
 		s.append(buffer);
 	}
 
-	void vsprintf(TQString &s,const TQString &szFmt,kvi_va_list list)
+	KVILIB_API void vsprintf(TQString &s,const TQString &szFmt,kvi_va_list list)
 	{
 #define MEMINCREMENT 32
 
@@ -690,7 +690,7 @@ namespace KviTQString
 	}
 
 
-	TQString & sprintf(TQString &s,const TQString &szFmt,...)
+	KVILIB_API TQString & sprintf(TQString &s,const TQString &szFmt,...)
 	{
 		kvi_va_list list;
 		kvi_va_start_by_reference(list,szFmt);
@@ -700,7 +700,7 @@ namespace KviTQString
 		return s;
 	}
 
-	void appendFormatted(TQString &s,const TQString &szFmt,...)
+	KVILIB_API void appendFormatted(TQString &s,const TQString &szFmt,...)
 	{
 		TQString tmp;
 		kvi_va_list list;
@@ -711,7 +711,7 @@ namespace KviTQString
 		s.append(tmp);
 	}
 
-	bool matchWildExpressionsCI(const TQString &szM1,const TQString &szM2)
+	KVILIB_API bool matchWildExpressionsCI(const TQString &szM1,const TQString &szM2)
 	{
 		//Matches two regular expressions containging wildcards (* and ?)
 	
@@ -804,7 +804,7 @@ namespace KviTQString
 		return (!(m2->unicode()));           //m1 surely finished , so for the match , m2 must be finished too
 	}
 
-	bool matchStringCI(const TQString &szExp,const TQString &szStr,bool bIsRegExp,bool bExact)
+	KVILIB_API bool matchStringCI(const TQString &szExp,const TQString &szStr,bool bIsRegExp,bool bExact)
 	{
 		TQString szWildcard;
 		TQChar* ptr=(TQChar*)szExp.ucs2();
@@ -826,7 +826,7 @@ namespace KviTQString
 		return re.search(szStr) != -1;
 	}
 
-	bool matchStringCS(const TQString &szExp,const TQString &szStr,bool bIsRegExp,bool bExact)
+	KVILIB_API bool matchStringCS(const TQString &szExp,const TQString &szStr,bool bIsRegExp,bool bExact)
 	{
 		TQString szWildcard;
 		TQChar* ptr=(TQChar*)szExp.ucs2();
@@ -848,21 +848,21 @@ namespace KviTQString
 		return re.search(szStr) != -1;
 	}
 
-	void cutFromFirst(TQString &s,const TQChar &c,bool bIncluded)
+	KVILIB_API void cutFromFirst(TQString &s,const TQChar &c,bool bIncluded)
 	{
 		int idx = s.find(c);
 		if(idx == -1)return;
 		s.truncate(bIncluded ? idx : idx + 1);
 	}
 
-	void cutFromLast(TQString &s,const TQChar &c,bool bIncluded)
+	KVILIB_API void cutFromLast(TQString &s,const TQChar &c,bool bIncluded)
 	{
 		int idx = s.findRev(c);
 		if(idx == -1)return;
 		s.truncate(bIncluded ? idx : idx + 1);
 	}
 	
-	void cutToFirst(TQString &s,const TQChar &c,bool bIncluded,bool bClearIfNotFound)
+	KVILIB_API void cutToFirst(TQString &s,const TQChar &c,bool bIncluded,bool bClearIfNotFound)
 	{
 		int idx = s.find(c);
 		if(idx == -1)
@@ -873,7 +873,7 @@ namespace KviTQString
 		s.remove(0,bIncluded ? idx + 1 : idx);
 	}
 	
-	void cutToLast(TQString &s,const TQChar &c,bool bIncluded,bool bClearIfNotFound)
+	KVILIB_API void cutToLast(TQString &s,const TQChar &c,bool bIncluded,bool bClearIfNotFound)
 	{
 		int idx = s.findRev(c);
 		if(idx == -1)
@@ -884,21 +884,21 @@ namespace KviTQString
 		s.remove(0,bIncluded ? idx + 1 : idx);
 	}
 
-	void cutFromFirst(TQString &s,const TQString &c,bool bIncluded)
+	KVILIB_API void cutFromFirst(TQString &s,const TQString &c,bool bIncluded)
 	{
 		int idx = s.find(c);
 		if(idx == -1)return;
 		s.truncate(bIncluded ? idx : idx + c.length());
 	}
 
-	void cutFromLast(TQString &s,const TQString &c,bool bIncluded)
+	KVILIB_API void cutFromLast(TQString &s,const TQString &c,bool bIncluded)
 	{
 		int idx = s.findRev(c);
 		if(idx == -1)return;
 		s.truncate(bIncluded ? idx : idx + c.length());
 	}
 	
-	void cutToFirst(TQString &s,const TQString &c,bool bIncluded,bool bClearIfNotFound)
+	KVILIB_API void cutToFirst(TQString &s,const TQString &c,bool bIncluded,bool bClearIfNotFound)
 	{
 		int idx = s.find(c);
 		if(idx == -1)
@@ -909,7 +909,7 @@ namespace KviTQString
 		s.remove(0,bIncluded ? idx + c.length() : idx);
 	}
 	
-	void cutToLast(TQString &s,const TQString &c,bool bIncluded,bool bClearIfNotFound)
+	KVILIB_API void cutToLast(TQString &s,const TQString &c,bool bIncluded,bool bClearIfNotFound)
 	{
 		int idx = s.findRev(c);
 		if(idx == -1)
@@ -920,7 +920,7 @@ namespace KviTQString
 		s.remove(0,bIncluded ? idx + c.length() : idx);
 	}
 
-	TQString upperISO88591(const TQString &szSrc)
+	KVILIB_API TQString upperISO88591(const TQString &szSrc)
 	{
 		const TQChar * c = nullTerminatedArray(szSrc);
 		if(!c)
@@ -946,7 +946,7 @@ namespace KviTQString
 		return ret;
 	}
 	
-	TQString lowerISO88591(const TQString &szSrc)
+	KVILIB_API TQString lowerISO88591(const TQString &szSrc)
 	{
 		const TQChar * c = nullTerminatedArray(szSrc);
 		if(!c)
@@ -973,7 +973,7 @@ namespace KviTQString
 		return ret;
 	}
 
-	void transliterate(TQString &s,const TQString &szToFind,const TQString &szReplacement)
+	KVILIB_API void transliterate(TQString &s,const TQString &szToFind,const TQString &szReplacement)
 	{
 		int i=0;
 		int il = MY_MIN(szToFind.length(),szReplacement.length());
@@ -992,7 +992,7 @@ namespace KviTQString
 	
 	static char hexdigits[16] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
 	
-	void bufferToHex(TQString &szRetBuffer,const unsigned char * buffer,unsigned int len)
+	KVILIB_API void bufferToHex(TQString &szRetBuffer,const unsigned char * buffer,unsigned int len)
 	{
 		szRetBuffer.setLength(len * 2);
 		unsigned int i=0;
diff --git a/src/kvilib/ext/kvi_regchan.h b/src/kvilib/ext/kvi_regchan.h
index f447c313..5b4e7554 100644
--- a/src/kvilib/ext/kvi_regchan.h
+++ b/src/kvilib/ext/kvi_regchan.h
@@ -51,7 +51,7 @@ public:
 	void removeProperty(const char * name){ m_pPropertyDict->remove(name); };
 };
 
-typedef KVILIB_API KviPointerList<KviRegisteredChannel> KviRegisteredChannelList;
+typedef KviPointerList<KviRegisteredChannel> KviRegisteredChannelList;
 
 class KVILIB_API KviRegisteredChannelDataBase
 {
diff --git a/src/kvilib/tal/kvi_tal_popupmenu.cpp b/src/kvilib/tal/kvi_tal_popupmenu.cpp
index 2033453c..af171832 100644
--- a/src/kvilib/tal/kvi_tal_popupmenu.cpp
+++ b/src/kvilib/tal/kvi_tal_popupmenu.cpp
@@ -1,3 +1,6 @@
+#ifndef _KVI_TAL_POPUPMENU_H_
+#define _KVI_TAL_POPUPMENU_H_
+
 //=============================================================================
 //
 //   File : kvi_tal_popupmenu.cpp
@@ -27,3 +30,4 @@
 
 	#include "kvi_tal_popupmenu_qt3.moc"
 
+#endif // _KVI_TAL_POPUPMENU_H_
diff --git a/src/kvirc/kernel/kvi_ipc.h b/src/kvirc/kernel/kvi_ipc.h
index 26c50ef0..9a4e8bad 100644
--- a/src/kvirc/kernel/kvi_ipc.h
+++ b/src/kvirc/kernel/kvi_ipc.h
@@ -64,6 +64,8 @@
 #endif //!COMPILE_ON_WINDOWS
 	};
 
+	KVIRC_API bool kvi_sendIpcMessage(const char * message);
+
 #endif //!COMPILE_NO_IPC
 
 
diff --git a/src/kvirc/kvs/kvi_kvs_hash.h b/src/kvirc/kvs/kvi_kvs_hash.h
index c7663cf3..2c811662 100644
--- a/src/kvirc/kvs/kvi_kvs_hash.h
+++ b/src/kvirc/kvs/kvi_kvs_hash.h
@@ -32,7 +32,7 @@
 #include "kvi_kvs_variant.h"
 #include "kvi_heapobject.h"
 
-typedef KVIRC_API KviPointerHashTableIterator<TQString,KviKvsVariant> KviKvsHashIterator;
+typedef KviPointerHashTableIterator<TQString,KviKvsVariant> KviKvsHashIterator;
 
 // This class must not have virtual funcitons nor destructor
 // Otherwise it will happily crash on windows when it is
diff --git a/src/kvirc/module/kvi_module.h b/src/kvirc/module/kvi_module.h
index f07c461c..4c9c063a 100644
--- a/src/kvirc/module/kvi_module.h
+++ b/src/kvirc/module/kvi_module.h
@@ -42,14 +42,16 @@
 
 
 #ifdef COMPILE_ON_WINDOWS
-	#define KVIMODULEEXPORT extern "C" __declspec(dllexport)
-	#define KVIMODULEEXPORTDATA KVIMODULEEXPORT
-	#define KVIMODULEEXPORTFUNC KVIMODULEEXPORT
+	#define KVIMODULEEXPORT __declspec(dllexport)
 #else
-	#define KVIMODULEEXPORT extern "C"
-	#define KVIMODULEEXPORTDATA
-	#define KVIMODULEEXPORTFUNC KVIMODULEEXPORT
+	#ifdef __TDE_HAVE_GCC_VISIBILITY
+		#define KVIMODULEEXPORT KVIRC_API
+	#else
+		#define KVIMODULEEXPORT
+	#endif
 #endif
+#define KVIMODULEEXPORTDATA KVIMODULEEXPORT
+#define KVIMODULEEXPORTFUNC KVIMODULEEXPORT
 
 class KviModule;
 
@@ -112,18 +114,21 @@ typedef struct _KviModuleInfo
 
 #define KVIRC_MODULE(_szModuleName,_szVersion,_szCopyright,_szDescription,_init_routine,_can_unload,_ctrl_routine,_cleanup_routine) \
 	\
-	KVIMODULEEXPORTDATA KviModuleInfo KVIrc_module_info= \
+	extern "C" \
 	{ \
-		KVI_VERSION, \
-		_szModuleName, \
-		_szVersion, \
-		_szCopyright, \
-		_szDescription, \
-		_init_routine, \
-		_can_unload, \
-		_ctrl_routine, \
-		_cleanup_routine \
-	};
+		KVIMODULEEXPORTDATA KviModuleInfo KVIrc_module_info= \
+		{ \
+			KVI_VERSION, \
+			_szModuleName, \
+			_szVersion, \
+			_szCopyright, \
+			_szDescription, \
+			_init_routine, \
+			_can_unload, \
+			_ctrl_routine, \
+			_cleanup_routine \
+		}; \
+	}
 	
 
 // old type parsing procedures
diff --git a/src/modules/dcc/requests.cpp b/src/modules/dcc/requests.cpp
index bf8a9192..1d5b284b 100644
--- a/src/modules/dcc/requests.cpp
+++ b/src/modules/dcc/requests.cpp
@@ -1132,7 +1132,7 @@ static dccParseProcEntry dccParseProcTable[KVI_NUM_KNOWN_DCC_TYPES]=
 // We want C linkage on this one: we want to be able to dlsym() it with a simple name
 // FIXME: Is this portable enough ? Or is better to have a table entry ?
 
-KVIMODULEEXPORTFUNC void dccModuleCtcpDccParseRoutine(KviDccRequest *dcc)
+extern "C" KVIMODULEEXPORTFUNC void dccModuleCtcpDccParseRoutine(KviDccRequest *dcc)
 {
 	dcc->szType.toUpper();
 	
diff --git a/src/modules/editor/libkvieditor.cpp b/src/modules/editor/libkvieditor.cpp
index e265a8ff..faa14c81 100644
--- a/src/modules/editor/libkvieditor.cpp
+++ b/src/modules/editor/libkvieditor.cpp
@@ -83,12 +83,12 @@ KVIRC_MODULE(
 // We want C linkage on this one: we want to be able to dlsym() it with a simple name
 // FIXME: Is this portable enough ? Or is better to have a table entry ?
 
-KVIMODULEEXPORTFUNC KviScriptEditor * editor_module_createScriptEditor(TQWidget * par)
+extern "C" KVIMODULEEXPORTFUNC KviScriptEditor * editor_module_createScriptEditor(TQWidget * par)
 {
 	return new KviScriptEditorImplementation(par);
 }
 
-KVIMODULEEXPORTFUNC void editor_module_destroyScriptEditor(KviScriptEditor * e)
+extern "C" KVIMODULEEXPORTFUNC void editor_module_destroyScriptEditor(KviScriptEditor * e)
 {
 	delete ((KviScriptEditorImplementation *)e);
 }
diff --git a/src/modules/mircimport/libkvimircimport.cpp b/src/modules/mircimport/libkvimircimport.cpp
index 96b74cf1..858675d3 100644
--- a/src/modules/mircimport/libkvimircimport.cpp
+++ b/src/modules/mircimport/libkvimircimport.cpp
@@ -355,7 +355,7 @@ static bool mircimport_module_can_unload(KviModule * m)
 }
 
 /*
-KVIMODULEEXPORTFUNC KviIrcServerImport * mircimport_module_createIrcServerImport(const char *filterName)
+extern "C" KVIMODULEEXPORTFUNC KviIrcServerImport * mircimport_module_createIrcServerImport(const char *filterName)
 {
 	if(kvi_strEqualCI(filterName,__tr("Import from servers.ini")))
 	{
diff --git a/src/modules/setup/libkvisetup.cpp b/src/modules/setup/libkvisetup.cpp
index 33184cc1..af8e0360 100644
--- a/src/modules/setup/libkvisetup.cpp
+++ b/src/modules/setup/libkvisetup.cpp
@@ -53,7 +53,7 @@ TQString szMircIni;
 
 // this is called by KviApp when no local kvirc directory has been found
 // we have nothing to rely on yet... (settings have not been loaded yet)
-KVIMODULEEXPORTFUNC bool setup_begin()
+extern "C" KVIMODULEEXPORTFUNC bool setup_begin()
 {
 	// FIXME: try to guess the user's .kvirc directory
 	//        and the preferred nickname from a previous installation
@@ -69,7 +69,7 @@ KVIMODULEEXPORTFUNC bool setup_begin()
 // all the subsystems are up and running (we even have a nice console
 // to write on if needed).
 // all the options are loaded.
-KVIMODULEEXPORTFUNC void setup_finish()
+extern "C" KVIMODULEEXPORTFUNC void setup_finish()
 {
 	if(bNeedToApplyDefaults)
 	{
-- 
cgit v1.2.3

