Skip to content

Commit 1c037e8

Browse files
committed
Add basic support of Java<->Native callbacks
Implement them for ImGuiIO::GetClipboardTextFn and ImGuiIO::SetClipboardTextFn
1 parent 168c760 commit 1c037e8

File tree

9 files changed

+131
-3
lines changed

9 files changed

+131
-3
lines changed

imgui-binding/src/main/java/imgui/ImGui.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public final class ImGui {
1818

1919
static {
2020
System.loadLibrary(System.getProperty(LIB_NAME_PROP, LIB_NAME_DEFAULT));
21-
initJniCommon();
21+
initJni();
2222
ImDrawList.nInit();
2323
ImDrawData.nInit();
2424
nInitInputTextData();
@@ -31,10 +31,12 @@ private ImGui() {
3131
#include <stdint.h>
3232
#include <imgui.h>
3333
#include "jni_common.h"
34+
#include "jni_callbacks.h"
3435
*/
3536

36-
private static native void initJniCommon(); /*
37+
private static native void initJni(); /*
3738
Jni::InitCommon(env);
39+
Jni::InitCallbacks(env);
3840
*/
3941

4042
// Context creation and access

imgui-binding/src/main/java/imgui/ImGuiIO.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package imgui;
22

3+
import imgui.callbacks.ImStrConsumer;
4+
import imgui.callbacks.ImStrSupplier;
5+
36
/**
47
* Communicate most settings and inputs/outputs to Dear ImGui using this structure.
58
* Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
@@ -11,6 +14,7 @@ public final class ImGuiIO {
1114
/*JNI
1215
#include <imgui.h>
1316
#include "jni_common.h"
17+
#include "jni_callbacks.h"
1418
*/
1519

1620
//------------------------------------------------------------------
@@ -253,7 +257,41 @@ public final class ImGuiIO {
253257
ImGui::GetIO().BackendRendererName = obj_backendRendererName == NULL ? NULL : (char*)env->GetStringUTFChars(obj_backendRendererName, JNI_FALSE);
254258
*/
255259

256-
// TODO clipboard callback
260+
// Optional: Access OS clipboard
261+
// (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
262+
263+
/*JNI
264+
jobject _setClipboardTextCallback = nullptr;
265+
jobject _getClipboardTextCallback = nullptr;
266+
267+
void setClipboardTextStub(void* userData, const char* text) {
268+
Jni::CallImStrConsumer(Jni::GetEnv(), _setClipboardTextCallback, text);
269+
}
270+
271+
const char* getClipboardTextStub(void* user_data) {
272+
JNIEnv* env = Jni::GetEnv();
273+
jstring jstr = Jni::CallImStrSupplier(env, _getClipboardTextCallback);
274+
return env->GetStringUTFChars(jstr, 0);
275+
}
276+
*/
277+
278+
public native void setSetClipboardTextFn(ImStrConsumer setClipboardTextCallback); /*
279+
if (_setClipboardTextCallback != nullptr) {
280+
env->DeleteGlobalRef(_setClipboardTextCallback);
281+
}
282+
283+
_setClipboardTextCallback = env->NewGlobalRef(setClipboardTextCallback);
284+
ImGui::GetIO().SetClipboardTextFn = setClipboardTextStub;
285+
*/
286+
287+
public native void setGetClipboardTextFn(ImStrSupplier getClipboardTextCallback); /*
288+
if (_getClipboardTextCallback != nullptr) {
289+
env->DeleteGlobalRef(_getClipboardTextCallback);
290+
}
291+
292+
_getClipboardTextCallback = env->NewGlobalRef(getClipboardTextCallback);
293+
ImGui::GetIO().GetClipboardTextFn = getClipboardTextStub;
294+
*/
257295

258296
//------------------------------------------------------------------
259297
// Input - Fill before calling NewFrame()
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package imgui.callbacks;
2+
3+
import java.util.function.Consumer;
4+
5+
/**
6+
* Callback to supply Java string form native code.
7+
*/
8+
public abstract class ImStrConsumer implements Consumer<String> {
9+
@Override
10+
public abstract void accept(String str);
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package imgui.callbacks;
2+
3+
import java.util.function.Supplier;
4+
5+
/**
6+
* Callback to get Java string from native code.
7+
*/
8+
public abstract class ImStrSupplier implements Supplier<String> {
9+
@Override
10+
public abstract String get();
11+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "jni_callbacks.h"
2+
3+
jmethodID jImStrConsumerAcceptMID;
4+
jmethodID jImStrSupplierGetMID;
5+
6+
namespace Jni
7+
{
8+
void InitCallbacks(JNIEnv* env) {
9+
jclass jImStrConsumer = env->FindClass("imgui/callbacks/ImStrConsumer");
10+
jImStrConsumerAcceptMID = env->GetMethodID(jImStrConsumer, "accept", "(Ljava/lang/String;)V");
11+
12+
jclass jImStrSupplier = env->FindClass("imgui/callbacks/ImStrSupplier");
13+
jImStrSupplierGetMID = env->GetMethodID(jImStrSupplier, "get", "()Ljava/lang/String;");
14+
}
15+
16+
void CallImStrConsumer(JNIEnv* env, jobject consumer, const char* str) {
17+
env->CallVoidMethod(consumer, jImStrConsumerAcceptMID, env->NewStringUTF(str));
18+
}
19+
20+
jstring CallImStrSupplier(JNIEnv* env, jobject supplier) {
21+
return (jstring)env->CallObjectMethod(supplier, jImStrSupplierGetMID);
22+
}
23+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include <jni.h>
2+
3+
#ifndef JNI_CALLBACK_H
4+
#define JNI_CALLBACK_H
5+
6+
namespace Jni
7+
{
8+
void InitCallbacks(JNIEnv* env);
9+
10+
void CallImStrConsumer(JNIEnv* env, jobject consumer, const char* str);
11+
jstring CallImStrSupplier(JNIEnv* env, jobject supplier);
12+
}
13+
14+
#endif

imgui-binding/src/main/native/jni_common.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ jfieldID imVec4YID;
88
jfieldID imVec4ZID;
99
jfieldID imVec4WID;
1010

11+
static JavaVM* jvm;
12+
1113
namespace Jni
1214
{
1315
void InitCommon(JNIEnv* env) {
16+
env->GetJavaVM(&jvm);
17+
1418
jclass jImVec2Class = env->FindClass("imgui/ImVec2");
1519
imVec2XID = env->GetFieldID(jImVec2Class, "x", "F");
1620
imVec2YID = env->GetFieldID(jImVec2Class, "y", "F");
@@ -22,6 +26,13 @@ void InitCommon(JNIEnv* env) {
2226
imVec4WID = env->GetFieldID(jImVec4Class, "w", "F");
2327
}
2428

29+
JNIEnv* GetEnv() {
30+
JNIEnv* env;
31+
jint res = jvm->GetEnv((void**)(&env), JNI_VERSION_1_8);
32+
assert(res == JNI_OK);
33+
return env;
34+
}
35+
2536
void ImVec2Cpy(JNIEnv* env, ImVec2* src, jobject dst) {
2637
env->SetFloatField(dst, imVec2XID, src->x);
2738
env->SetFloatField(dst, imVec2YID, src->y);

imgui-binding/src/main/native/jni_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace Jni
88
{
99
void InitCommon(JNIEnv* env);
1010

11+
JNIEnv* GetEnv();
12+
1113
void ImVec2Cpy(JNIEnv* env, ImVec2* src, jobject dst);
1214
void ImVec2Cpy(JNIEnv* env, ImVec2 src, jobject dst);
1315

imgui-lwjgl3/src/test/java/ImGuiGlfwExample.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import imgui.ImGui;
33
import imgui.ImGuiIO;
44
import imgui.ImString;
5+
import imgui.callbacks.ImStrConsumer;
6+
import imgui.callbacks.ImStrSupplier;
57
import imgui.enums.ImGuiBackendFlags;
68
import imgui.enums.ImGuiColorEditFlags;
79
import imgui.enums.ImGuiCond;
@@ -214,6 +216,20 @@ private void initImGui() {
214216
io.setMouseWheel(io.getMouseWheel() + (float) yOffset);
215217
});
216218

219+
io.setSetClipboardTextFn(new ImStrConsumer() {
220+
@Override
221+
public void accept(final String s) {
222+
glfwSetClipboardString(window, s);
223+
}
224+
});
225+
226+
io.setGetClipboardTextFn(new ImStrSupplier() {
227+
@Override
228+
public String get() {
229+
return glfwGetClipboardString(window);
230+
}
231+
});
232+
217233
// Initialize renderer itself
218234
imGuiGl3.init();
219235
}

0 commit comments

Comments
 (0)