Unverified Commit c4e6b175 authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Properly compute window handle on Linux (#212)

parent 40668d6a
#include <jawt_md.h> #include <jawt_md.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glx.h> #include <GL/glx.h>
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xresource.h> #include <X11/Xresource.h>
#include <cstdlib> #include <cstdlib>
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include "jni_helpers.h" #include "jni_helpers.h"
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display *, GLXFBConfig, GLXContext, Bool, const int *); typedef GLXContext (*glXCreateContextAttribsARBProc)(Display *, GLXFBConfig, GLXContext, Bool, const int *);
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeInit(JNIEnv *env, jobject canvas, jlong platformInfoPtr) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeInit(JNIEnv *env, jobject canvas, jlong platformInfoPtr)
{ {
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeDispose(JNIEnv *env, jobject canvas) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeDispose(JNIEnv *env, jobject canvas)
{ {
} }
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle(JNIEnv *env, jobject canvas, jlong platformInfoPtr) JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle(JNIEnv *env, jobject canvas, jlong platformInfoPtr)
{ {
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr); JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr);
return (jlong) dsi_x11->display; Window win = dsi_x11->drawable;
} Window parent = win;
Window root = None;
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_HardwareLayer_getContentHandle(JNIEnv *env, jobject canvas, jlong platformInfoPtr) Window *children;
{ unsigned int nchildren;
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr); Status s;
return (jlong) dsi_x11->drawable;
} while (parent != root) {
win = parent;
double getDpiScaleByDisplay(Display *display) s = XQueryTree(dsi_x11->display, win, &root, &parent, &children, &nchildren);
{
char *resourceManager = XResourceManagerString(display); if (s)
if (resourceManager != nullptr) XFree(children);
{ else
XrmDatabase db = XrmGetStringDatabase(resourceManager); return 0;
if (db != nullptr) }
{ return (jlong)win;
XrmValue value; }
char *type; JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_HardwareLayer_getContentHandle(JNIEnv *env, jobject canvas, jlong platformInfoPtr)
XrmGetResource(db, "Xft.dpi", "Xft.dpi", &type, &value); {
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr);
if (value.addr != nullptr) return (jlong) dsi_x11->drawable;
{ }
return atof(value.addr) / 96.0;
} double getDpiScaleByDisplay(Display *display)
} {
} char *resourceManager = XResourceManagerString(display);
return 1; if (resourceManager != nullptr)
} {
XrmDatabase db = XrmGetStringDatabase(resourceManager);
double getDpiScale() { if (db != nullptr)
Display *display = XOpenDisplay(nullptr); {
if (display != nullptr) { XrmValue value;
double result = getDpiScaleByDisplay(display);
XCloseDisplay(display); char *type;
return result; XrmGetResource(db, "Xft.dpi", "Xft.dpi", &type, &value);
} else {
return 1; if (value.addr != nullptr)
} {
} return atof(value.addr) / 96.0;
}
JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_PlatformOperationsKt_linuxGetDpiScaleNative(JNIEnv *env, jobject properties, jlong platformInfoPtr) }
{ }
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr); return 1;
return (float) getDpiScaleByDisplay(dsi_x11->display); }
}
double getDpiScale() {
JNIEXPORT jint JNICALL Java_org_jetbrains_skiko_SystemThemeKt_getCurrentSystemTheme(JNIEnv *env, jobject topLevel) Display *display = XOpenDisplay(nullptr);
{ if (display != nullptr) {
// Unknown. double result = getDpiScaleByDisplay(display);
return 2; XCloseDisplay(display);
} return result;
} else {
return 1;
JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_SetupKt_linuxGetSystemDpiScale(JNIEnv *env, jobject layer) }
{ }
return (float) getDpiScale();
} JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_PlatformOperationsKt_linuxGetDpiScaleNative(JNIEnv *env, jobject properties, jlong platformInfoPtr)
{
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr);
return (float) getDpiScaleByDisplay(dsi_x11->display);
}
JNIEXPORT jint JNICALL Java_org_jetbrains_skiko_SystemThemeKt_getCurrentSystemTheme(JNIEnv *env, jobject topLevel)
{
// Unknown.
return 2;
}
JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_SetupKt_linuxGetSystemDpiScale(JNIEnv *env, jobject layer)
{
return (float) getDpiScale();
}
} // extern "C" } // extern "C"
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment