mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-06 14:00:55 +03:00
Native Libraries:
- made C methods `static` (similar to `private` in Java) to avoid that they are added (exported) to shared library symbol table - macOS and Linux: added `-fvisibility=hidden` to compiler options to mark C methods hidden by default
This commit is contained in:
@@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
`cpp-library`
|
`cpp-library`
|
||||||
`flatlaf-cpp-library`
|
`flatlaf-cpp-library`
|
||||||
@@ -67,7 +69,7 @@ tasks {
|
|||||||
|
|
||||||
compilerArgs.addAll( toolChain.map {
|
compilerArgs.addAll( toolChain.map {
|
||||||
when( it ) {
|
when( it ) {
|
||||||
is Gcc, is Clang -> listOf()
|
is Gcc, is Clang -> listOf( "-fvisibility=hidden" )
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
} )
|
} )
|
||||||
@@ -108,6 +110,29 @@ tasks {
|
|||||||
into( nativesDir )
|
into( nativesDir )
|
||||||
rename( "libflatlaf-natives-linux.so", libraryName )
|
rename( "libflatlaf-natives-linux.so", libraryName )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*dump
|
||||||
|
val dylib = linkedFile.asFile.get()
|
||||||
|
val dylibDir = dylib.parent
|
||||||
|
exec { commandLine( "size", dylib ) }
|
||||||
|
exec {
|
||||||
|
commandLine( "objdump",
|
||||||
|
// commands
|
||||||
|
"--archive-headers",
|
||||||
|
"--section-headers",
|
||||||
|
"--private-headers",
|
||||||
|
"--reloc",
|
||||||
|
"--dynamic-reloc",
|
||||||
|
"--syms",
|
||||||
|
// options
|
||||||
|
// "--private-header",
|
||||||
|
// files
|
||||||
|
dylib )
|
||||||
|
standardOutput = FileOutputStream( "$dylibDir/objdump.txt" )
|
||||||
|
}
|
||||||
|
exec { commandLine( "objdump", "--disassemble-all", dylib ); standardOutput = FileOutputStream( "$dylibDir/disassemble.txt" ) }
|
||||||
|
exec { commandLine( "objdump", "--full-contents", dylib ); standardOutput = FileOutputStream( "$dylibDir/full-contents.txt" ) }
|
||||||
|
dump*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
* @since 3.6
|
* @since 3.6
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// see X11WmUtils.cpp
|
// declare external methods
|
||||||
Window getWindowHandle( JNIEnv* env, JAWT* awt, jobject window, Display** display_return );
|
extern Window getWindowHandle( JNIEnv* env, JAWT* awt, jobject window, Display** display_return );
|
||||||
|
|
||||||
//---- class AutoReleaseStringUTF8 --------------------------------------------
|
//---- class AutoReleaseStringUTF8 --------------------------------------------
|
||||||
|
|
||||||
@@ -55,12 +55,12 @@ public:
|
|||||||
#define isOptionClear( option ) ((optionsClear & com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_ ## option) != 0)
|
#define isOptionClear( option ) ((optionsClear & com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_ ## option) != 0)
|
||||||
#define isOptionSetOrClear( option ) isOptionSet( option ) || isOptionClear( option )
|
#define isOptionSetOrClear( option ) isOptionSet( option ) || isOptionClear( option )
|
||||||
|
|
||||||
jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
static jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
||||||
jclass stringClass = env->FindClass( "java/lang/String" );
|
jclass stringClass = env->FindClass( "java/lang/String" );
|
||||||
return env->NewObjectArray( count, stringClass, NULL );
|
return env->NewObjectArray( count, stringClass, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
void initFilters( GtkFileChooser* chooser, JNIEnv* env, jint fileTypeIndex, jobjectArray fileTypes ) {
|
static void initFilters( GtkFileChooser* chooser, JNIEnv* env, jint fileTypeIndex, jobjectArray fileTypes ) {
|
||||||
jint length = env->GetArrayLength( fileTypes );
|
jint length = env->GetArrayLength( fileTypes );
|
||||||
if( length <= 0 )
|
if( length <= 0 )
|
||||||
return;
|
return;
|
||||||
@@ -89,7 +89,7 @@ void initFilters( GtkFileChooser* chooser, JNIEnv* env, jint fileTypeIndex, jobj
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkWindow* getGdkWindow( JNIEnv* env, jobject window ) {
|
static GdkWindow* getGdkWindow( JNIEnv* env, jobject window ) {
|
||||||
// get the AWT
|
// get the AWT
|
||||||
JAWT awt;
|
JAWT awt;
|
||||||
awt.version = JAWT_VERSION_1_4;
|
awt.version = JAWT_VERSION_1_4;
|
||||||
|
|||||||
@@ -25,11 +25,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
bool sendEvent( JNIEnv *env, jobject window, const char *atom_name,
|
// declare exported methods
|
||||||
long data0, long data1, long data2, long data3, long data4 );
|
|
||||||
bool isWMHintSupported( Display* display, Window rootWindow, Atom atom );
|
|
||||||
Window getWindowHandle( JNIEnv* env, JAWT* awt, jobject window, Display** display_return );
|
Window getWindowHandle( JNIEnv* env, JAWT* awt, jobject window, Display** display_return );
|
||||||
|
|
||||||
|
// declare internal methods
|
||||||
|
static bool sendEvent( JNIEnv *env, jobject window, const char *atom_name,
|
||||||
|
long data0, long data1, long data2, long data3, long data4 );
|
||||||
|
static bool isWMHintSupported( Display* display, Window rootWindow, Atom atom );
|
||||||
|
|
||||||
|
|
||||||
//---- JNI methods ------------------------------------------------------------
|
//---- JNI methods ------------------------------------------------------------
|
||||||
|
|
||||||
@@ -79,7 +82,7 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeLinuxLibrary_xS
|
|||||||
0 );
|
0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sendEvent( JNIEnv *env, jobject window, const char *atom_name,
|
static bool sendEvent( JNIEnv *env, jobject window, const char *atom_name,
|
||||||
long data0, long data1, long data2, long data3, long data4 )
|
long data0, long data1, long data2, long data3, long data4 )
|
||||||
{
|
{
|
||||||
// get the AWT
|
// get the AWT
|
||||||
@@ -131,7 +134,7 @@ bool sendEvent( JNIEnv *env, jobject window, const char *atom_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isWMHintSupported( Display* display, Window rootWindow, Atom atom ) {
|
static bool isWMHintSupported( Display* display, Window rootWindow, Atom atom ) {
|
||||||
Atom type;
|
Atom type;
|
||||||
int format;
|
int format;
|
||||||
unsigned long n_atoms;
|
unsigned long n_atoms;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ tasks {
|
|||||||
|
|
||||||
compilerArgs.addAll( toolChain.map {
|
compilerArgs.addAll( toolChain.map {
|
||||||
when( it ) {
|
when( it ) {
|
||||||
is Gcc, is Clang -> listOf( "-x", "objective-c++", "-mmacosx-version-min=$minOs" )
|
is Gcc, is Clang -> listOf( "-x", "objective-c++", "-mmacosx-version-min=$minOs", "-fvisibility=hidden" )
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
} )
|
} )
|
||||||
|
|||||||
@@ -126,10 +126,10 @@
|
|||||||
#define isOptionClear( option ) ((optionsClear & com_formdev_flatlaf_ui_FlatNativeMacLibrary_ ## option) != 0)
|
#define isOptionClear( option ) ((optionsClear & com_formdev_flatlaf_ui_FlatNativeMacLibrary_ ## option) != 0)
|
||||||
#define isOptionSetOrClear( option ) isOptionSet( option ) || isOptionClear( option )
|
#define isOptionSetOrClear( option ) isOptionSet( option ) || isOptionClear( option )
|
||||||
|
|
||||||
// declare methods
|
// declare external methods
|
||||||
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
|
extern NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
|
||||||
|
|
||||||
jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
static jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
||||||
jclass stringClass = env->FindClass( "java/lang/String" );
|
jclass stringClass = env->FindClass( "java/lang/String" );
|
||||||
return env->NewObjectArray( count, stringClass, NULL );
|
return env->NewObjectArray( count, stringClass, NULL );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,13 +39,15 @@
|
|||||||
@implementation WindowData
|
@implementation WindowData
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// declare internal methods
|
// declare exported methods
|
||||||
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
|
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
|
||||||
WindowData* getWindowData( NSWindow* nsWindow, bool allocate );
|
|
||||||
void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden );
|
// declare internal methods
|
||||||
int getWindowButtonAreaWidth( NSWindow* nsWindow );
|
static WindowData* getWindowData( NSWindow* nsWindow, bool allocate );
|
||||||
int getWindowTitleBarHeight( NSWindow* nsWindow );
|
static void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden );
|
||||||
bool isWindowFullScreen( NSWindow* nsWindow );
|
static int getWindowButtonAreaWidth( NSWindow* nsWindow );
|
||||||
|
static int getWindowTitleBarHeight( NSWindow* nsWindow );
|
||||||
|
static bool isWindowFullScreen( NSWindow* nsWindow );
|
||||||
|
|
||||||
|
|
||||||
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ) {
|
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ) {
|
||||||
@@ -79,7 +81,7 @@ NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ) {
|
|||||||
return (NSWindow *) jlong_to_ptr( env->GetLongField( platformWindow, ptrID ) );
|
return (NSWindow *) jlong_to_ptr( env->GetLongField( platformWindow, ptrID ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowData* getWindowData( NSWindow* nsWindow, bool allocate ) {
|
static WindowData* getWindowData( NSWindow* nsWindow, bool allocate ) {
|
||||||
static char key;
|
static char key;
|
||||||
WindowData* windowData = objc_getAssociatedObject( nsWindow, &key );
|
WindowData* windowData = objc_getAssociatedObject( nsWindow, &key );
|
||||||
if( windowData == NULL && allocate ) {
|
if( windowData == NULL && allocate ) {
|
||||||
@@ -243,7 +245,7 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden ) {
|
static void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden ) {
|
||||||
// get buttons
|
// get buttons
|
||||||
NSView* buttons[3] = {
|
NSView* buttons[3] = {
|
||||||
[nsWindow standardWindowButton:NSWindowCloseButton],
|
[nsWindow standardWindowButton:NSWindowCloseButton],
|
||||||
@@ -303,7 +305,7 @@ JNIEXPORT jobject JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_getWi
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getWindowButtonAreaWidth( NSWindow* nsWindow ) {
|
static int getWindowButtonAreaWidth( NSWindow* nsWindow ) {
|
||||||
// get buttons
|
// get buttons
|
||||||
NSView* buttons[3] = {
|
NSView* buttons[3] = {
|
||||||
[nsWindow standardWindowButton:NSWindowCloseButton],
|
[nsWindow standardWindowButton:NSWindowCloseButton],
|
||||||
@@ -335,7 +337,7 @@ int getWindowButtonAreaWidth( NSWindow* nsWindow ) {
|
|||||||
return right + left;
|
return right + left;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getWindowTitleBarHeight( NSWindow* nsWindow ) {
|
static int getWindowTitleBarHeight( NSWindow* nsWindow ) {
|
||||||
NSView* closeButton = [nsWindow standardWindowButton:NSWindowCloseButton];
|
NSView* closeButton = [nsWindow standardWindowButton:NSWindowCloseButton];
|
||||||
if( closeButton == NULL )
|
if( closeButton == NULL )
|
||||||
return -1;
|
return -1;
|
||||||
@@ -360,7 +362,7 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_isWi
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isWindowFullScreen( NSWindow* nsWindow ) {
|
static bool isWindowFullScreen( NSWindow* nsWindow ) {
|
||||||
return ((nsWindow.styleMask & NSWindowStyleMaskFullScreen) != 0);
|
return ((nsWindow.styleMask & NSWindowStyleMaskFullScreen) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,15 @@ tasks {
|
|||||||
into( nativesDir )
|
into( nativesDir )
|
||||||
rename( "flatlaf-natives-windows.dll", libraryName )
|
rename( "flatlaf-natives-windows.dll", libraryName )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*dump
|
||||||
|
val dumpbin = "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/dumpbin.exe"
|
||||||
|
val dll = linkedFile.asFile.get()
|
||||||
|
val dllDir = dll.parent
|
||||||
|
exec { commandLine( dumpbin, "/all", "/rawdata:none", "/out:$dllDir/objdump.txt", dll ) }
|
||||||
|
exec { commandLine( dumpbin, "/all", "/out:$dllDir/full-contents.txt", dll ) }
|
||||||
|
exec { commandLine( dumpbin, "/disasm", "/out:$dllDir/disassemble.txt", dll ) }
|
||||||
|
dump*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// declare exported methods
|
||||||
HWND getWindowHandle( JNIEnv* env, jobject window );
|
HWND getWindowHandle( JNIEnv* env, jobject window );
|
||||||
|
|
||||||
//---- JNI methods ------------------------------------------------------------
|
//---- JNI methods ------------------------------------------------------------
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
* @since 3.6
|
* @since 3.6
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// see FlatWndProc.cpp
|
// declare external methods
|
||||||
HWND getWindowHandle( JNIEnv* env, jobject window );
|
extern HWND getWindowHandle( JNIEnv* env, jobject window );
|
||||||
|
|
||||||
//---- class AutoReleasePtr ---------------------------------------------------
|
//---- class AutoReleasePtr ---------------------------------------------------
|
||||||
|
|
||||||
@@ -147,12 +147,12 @@ public:
|
|||||||
#define isOptionSet( option ) ((optionsSet & com_formdev_flatlaf_ui_FlatNativeWindowsLibrary_ ## option) != 0)
|
#define isOptionSet( option ) ((optionsSet & com_formdev_flatlaf_ui_FlatNativeWindowsLibrary_ ## option) != 0)
|
||||||
#define CHECK_HRESULT( code ) { if( (code) != S_OK ) return NULL; }
|
#define CHECK_HRESULT( code ) { if( (code) != S_OK ) return NULL; }
|
||||||
|
|
||||||
jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
static jobjectArray newJavaStringArray( JNIEnv* env, jsize count ) {
|
||||||
jclass stringClass = env->FindClass( "java/lang/String" );
|
jclass stringClass = env->FindClass( "java/lang/String" );
|
||||||
return env->NewObjectArray( count, stringClass, NULL );
|
return env->NewObjectArray( count, stringClass, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
jstring newJavaString( JNIEnv* env, LPWSTR str ) {
|
static jstring newJavaString( JNIEnv* env, LPWSTR str ) {
|
||||||
return env->NewString( reinterpret_cast<jchar*>( str ), static_cast<jsize>( wcslen( str ) ) );
|
return env->NewString( reinterpret_cast<jchar*>( str ), static_cast<jsize>( wcslen( str ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// see FlatWndProc.cpp
|
// declare external methods
|
||||||
HWND getWindowHandle( JNIEnv* env, jobject window );
|
extern HWND getWindowHandle( JNIEnv* env, jobject window );
|
||||||
|
|
||||||
//---- Utility ----------------------------------------------------------------
|
//---- Utility ----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user