# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1634430856 0 # Node ID 917f2d1f9cae665634a063ffe1b05fbf7065679f # Parent 2ae70678c8450aa017695ba5407ad2c89bb74abb Android: Implement dw_window_destroy() and try to add a back button to secondary windows that will call windowDestroy() on them when pressed. diff -r 2ae70678c845 -r 917f2d1f9cae android/DWindows.kt --- a/android/DWindows.kt Fri Oct 15 23:22:23 2021 +0000 +++ b/android/DWindows.kt Sun Oct 17 00:34:16 2021 +0000 @@ -969,6 +969,17 @@ return false } + override fun onBackPressed() { + if(windowLayout != null) { + val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter + val index = windowLayout!!.currentItem + + if (index > 0) { + windowDestroy(adapter.viewList[index]) + } + } + } + // These are the Android calls to actually create the UI... // forwarded from the C Dynamic Windows API @@ -1417,6 +1428,12 @@ if(windowDefault[index] != null) { windowDefault[index]?.requestFocus() } + // Add or remove a back button depending on the visible window + if(index > 0) { + this.actionBar?.setDisplayHomeAsUpEnabled(true) + } else { + this.actionBar?.setDisplayHomeAsUpEnabled(false) + } // Invalidate the menu, so it gets updated for the new window invalidateOptionsMenu() } @@ -1440,6 +1457,52 @@ } } + fun windowDestroy(window: View): Int { + var retval: Int = 1 // DW_ERROR_GENERAL + + if(windowLayout != null) { + waitOnUiThread { + val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter + val index = adapter.viewList.indexOf(window) + + // We need to have at least 1 window... + // so only destroy secondary windows + if(index > 0) { + val newindex = index - 1 + val newwindow = adapter.viewList[newindex] + + // Make sure the previous window is visible... + // not sure if we should search the list for a visible + // window or force it visible. Forcing visible for now. + if(newwindow.visibility != View.VISIBLE) { + newwindow.visibility = View.VISIBLE + } + // Switch to the previous window + windowSwitchWindow(newindex) + + // Update our window list + adapter.viewList.removeAt(index) + windowTitles.removeAt(index) + windowMenuBars.removeAt(index) + windowStyles.removeAt(index) + windowDefault.removeAt(index) + + retval = 0 // DW_ERROR_NONE + } else { + // If we are removing an individual widget, + // find the parent layout and remove it. + if(window.parent is ViewGroup) { + val group = window.parent as ViewGroup + + group.removeView(window) + retval = 0 // DW_ERROR_NONE + } + } + } + } + return retval + } + fun clipboardGetText(): String { val cm: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clipdata = cm.primaryClip diff -r 2ae70678c845 -r 917f2d1f9cae android/dw.cpp --- a/android/dw.cpp Fri Oct 15 23:22:23 2021 +0000 +++ b/android/dw.cpp Sun Oct 17 00:34:16 2021 +0000 @@ -5501,7 +5501,21 @@ */ int API dw_window_destroy(HWND handle) { - return DW_ERROR_GENERAL; + JNIEnv *env; + int retval = DW_ERROR_GENERAL; + + if(handle && (env = (JNIEnv *)pthread_getspecific(_dw_env_key))) + { + // First get the class that contains the method you need to call + jclass clazz = _dw_find_class(env, DW_CLASS_NAME); + // Get the method that you want to call + jmethodID windowDestroy = env->GetMethodID(clazz, "windowDestroy", + "(Landroid/view/View;)I"); + // Call the method on the object + retval = env->CallIntMethod(_dw_obj, windowDestroy, handle); + _dw_jni_check_exception(env); + } + return retval; } /*