mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-04-28 20:27:58 +03:00
View: call onLayout() only on size change or on request
GTK always wants us to call gtk_widget_allocate() on all children, so we need to do it manually when not calling onLayout().
This commit is contained in:
parent
f0fcd47c80
commit
b33a470c7b
3 changed files with 26 additions and 7 deletions
|
@ -134,7 +134,7 @@ void set_up_handle_cache(JNIEnv *env)
|
||||||
handle_cache.view.onTouchEvent = _METHOD(handle_cache.view.class, "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
handle_cache.view.onTouchEvent = _METHOD(handle_cache.view.class, "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
handle_cache.view.dispatchTouchEvent = _METHOD(handle_cache.view.class, "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
handle_cache.view.dispatchTouchEvent = _METHOD(handle_cache.view.class, "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
handle_cache.view.onInterceptTouchEvent = _METHOD(handle_cache.view.class, "onInterceptTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
handle_cache.view.onInterceptTouchEvent = _METHOD(handle_cache.view.class, "onInterceptTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
handle_cache.view.layoutInternal = _METHOD(handle_cache.view.class, "layoutInternal", "(II)V");
|
handle_cache.view.layoutInternal = _METHOD(handle_cache.view.class, "layoutInternal", "(II)Z");
|
||||||
handle_cache.view.measure = _METHOD(handle_cache.view.class, "measure", "(II)V");
|
handle_cache.view.measure = _METHOD(handle_cache.view.class, "measure", "(II)V");
|
||||||
handle_cache.view.performLongClick = _METHOD(handle_cache.view.class, "performLongClick", "(FF)Z");
|
handle_cache.view.performLongClick = _METHOD(handle_cache.view.class, "performLongClick", "(FF)Z");
|
||||||
handle_cache.view.getId = _METHOD(handle_cache.view.class, "getId", "()I");
|
handle_cache.view.getId = _METHOD(handle_cache.view.class, "getId", "()I");
|
||||||
|
|
|
@ -70,9 +70,18 @@ static void android_layout_allocate(GtkLayoutManager *layout_manager, GtkWidget
|
||||||
height = layout->real_height;
|
height = layout->real_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*env)->CallVoidMethod(env, layout->view, handle_cache.view.layoutInternal, width, height);
|
jboolean layoutChanged = (*env)->CallBooleanMethod(env, layout->view, handle_cache.view.layoutInternal, width, height);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
|
if (!layoutChanged) { // No change in layout. Reapply the current allocations
|
||||||
|
for (GtkWidget *child = gtk_widget_get_first_child(widget); child; child = gtk_widget_get_next_sibling(child)) {
|
||||||
|
graphene_matrix_t transform_matrix;
|
||||||
|
if (gtk_widget_compute_transform(child, widget, &transform_matrix)) {
|
||||||
|
GskTransform *transform = gsk_transform_matrix(NULL, &transform_matrix);
|
||||||
|
gtk_widget_allocate(child, gtk_widget_get_width(child), gtk_widget_get_height(child), gtk_widget_get_baseline(child), transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkSizeRequestMode android_layout_get_request_mode(GtkLayoutManager *layout_manager, GtkWidget *widget)
|
static GtkSizeRequestMode android_layout_get_request_mode(GtkLayoutManager *layout_manager, GtkWidget *widget)
|
||||||
|
|
|
@ -847,6 +847,7 @@ public class View implements Drawable.Callback {
|
||||||
private int oldWidthMeasureSpec = -1;
|
private int oldWidthMeasureSpec = -1;
|
||||||
private int oldHeightMeasureSpec = -1;
|
private int oldHeightMeasureSpec = -1;
|
||||||
private boolean layoutRequested = true;
|
private boolean layoutRequested = true;
|
||||||
|
private boolean layoutPending = true;
|
||||||
private int oldWidth;
|
private int oldWidth;
|
||||||
private int oldHeight;
|
private int oldHeight;
|
||||||
protected boolean haveCustomMeasure = true;
|
protected boolean haveCustomMeasure = true;
|
||||||
|
@ -1366,6 +1367,7 @@ public class View implements Drawable.Callback {
|
||||||
oldHeightMeasureSpec = heightMeasureSpec;
|
oldHeightMeasureSpec = heightMeasureSpec;
|
||||||
onMeasure(widthMeasureSpec, heightMeasureSpec);
|
onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||||
layoutRequested = false;
|
layoutRequested = false;
|
||||||
|
layoutPending = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1441,8 +1443,10 @@ public class View implements Drawable.Callback {
|
||||||
native_layout(widget, l, t, r, b);
|
native_layout(widget, l, t, r, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Helper function to be called from GTKs LayoutManager via JNI */
|
/** Helper function to be called from GTK's LayoutManager via JNI
|
||||||
private void layoutInternal(int width, int height) {
|
* @return true if the layout changed
|
||||||
|
*/
|
||||||
|
private boolean layoutInternal(int width, int height) {
|
||||||
// if the layout is triggered from a native widget, we might not have measured yet
|
// if the layout is triggered from a native widget, we might not have measured yet
|
||||||
if (width != getMeasuredWidth() || height != getMeasuredHeight()) {
|
if (width != getMeasuredWidth() || height != getMeasuredHeight()) {
|
||||||
measure(width | MeasureSpec.EXACTLY, height | MeasureSpec.EXACTLY);
|
measure(width | MeasureSpec.EXACTLY, height | MeasureSpec.EXACTLY);
|
||||||
|
@ -1452,9 +1456,15 @@ public class View implements Drawable.Callback {
|
||||||
onSizeChanged(width, height, oldWidth, oldHeight);
|
onSizeChanged(width, height, oldWidth, oldHeight);
|
||||||
bottom = top + height;
|
bottom = top + height;
|
||||||
right = left + width;
|
right = left + width;
|
||||||
onLayout(changed, 0, 0, width, height);
|
if (changed || layoutPending) {
|
||||||
oldWidth = width;
|
layoutPending = false;
|
||||||
oldHeight = height;
|
onLayout(changed, 0, 0, width, height);
|
||||||
|
oldWidth = width;
|
||||||
|
oldHeight = height;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLeft() {
|
public int getLeft() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue