吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2906|回复: 3
收起左侧

[Android 求助] 关于Juicessh输出宽字符的控制

[复制链接]
zixijian 发表于 2019-11-11 14:58
本帖最后由 zixijian 于 2019-11-11 15:36 编辑

最近一直在用Juicessh连接ssh玩MUDs文字游戏,
发现该app对中文的输出重叠、缺失、断行,
同时Termux终端玩则没有问题。
经过我的一番排查,字体有一定的影响,
我提取了termux的iosevka字体替换到juicessh,
这时候使用同样字体进行比对;
juicessh:中文正常、制表符等字符比termux短一半,用字符组成表格错位。
termux:中文断行,制表符等字符中间有空格,用字符组成表格正常。

后来某位群主告诉我,这是对中文字符的宽度处理造成的,一般英文为一个字符的宽度,中文为两个字符的宽度。
这些app字体都不带中文,中文都是fallback到系统上。
可以看出来,juicessh把所有字符包括中文都按一个字符的宽度来处理,termux则是两个字符宽度。
我玩的mud游戏应该是默认两个字符宽度,所以在juicessh中中文及字符显示就没那么完美。
由于juicessh中没有设置项,我自己找了找smali没有找到,特来求助怎么才能控制字符的输出宽度,望不吝赐教。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| zixijian 发表于 2019-11-12 21:09
[JavaScript] 纯文本查看 复制代码
package com.sonelli.juicessh.views;

import android.content.Context;
import android.graphics.Typeface;
import android.util.DisplayMetrics;
import android.view.GestureDetector.OnGestureListener;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.sonelli.adj;
import com.sonelli.aip;
import com.sonelli.aiq;
import com.sonelli.anw;
import jackpal.androidterm.emulatorview.EmulatorView;
import jackpal.androidterm.emulatorview.TermSession;

public class TerminalView extends EmulatorView {
    private OnResizeListener a;
    private OnBackListener b;
    private OnEscListener c;
    private OnGestureListener d;

    public interface OnBackListener {
        boolean a();
    }

    public interface OnEscListener {
        boolean a();
    }

    public interface OnResizeListener {
        void a(int i, int i2, int i3, int i4);
    }

    protected void onSizeChanged(int i, int i2, int i3, int i4) {
        super.onSizeChanged(i, i2, i3, i4);
        if (this.a != null) {
            this.a.a(i, i2, i3, i4);
        }
    }

    public void setTextSize(int i) {
        super.setTextSize(i);
        if (this.a != null) {
            this.a.a(getWidth(), getHeight(), getWidth(), getHeight());
        }
    }

    protected void onWindowVisibilityChanged(int i) {
        super.onWindowVisibilityChanged(i);
        switch (i) {
            case 0:
                postDelayed(new aip(this), 200);
                return;
            default:
                return;
        }
    }

    public TerminalView(int i, Context context, TermSession termSession, DisplayMetrics displayMetrics) {
        super(context, termSession, displayMetrics);
        setUseCookedIME(true);
        setOnFocusChangeListener(new aiq(this));
    }

    public void a(OnEscListener onEscListener) {
        this.c = onEscListener;
    }

    public void a(OnResizeListener onResizeListener) {
        this.a = onResizeListener;
    }

    public boolean dispatchKeyEventPreIme(KeyEvent keyEvent) {
        switch (keyEvent.getKeyCode()) {
            case 4:
                if (keyEvent.getAction() != 0) {
                    return false;
                }
                if (keyEvent.getDevice() == null || keyEvent.getDeviceId() < 0 || keyEvent.getDevice().getKeyboardType() != 2) {
                    if (this.b != null) {
                        return this.b.a();
                    }
                    return false;
                } else if (this.c != null) {
                    return this.c.a();
                } else {
                    return false;
                }
            case 111:
                if (keyEvent.getAction() != 0 || this.c == null) {
                    return false;
                }
                return this.c.a();
            default:
                return false;
        }
    }

    public Typeface getFont() {
        adj.c("Views/TerminalView", "Setting font to embedded monospace font");
        return Typeface.createFromAsset(getContext().getAssets(), "fonts/DroidSansMono.ttf");
    }

    public void setColors(int[] iArr) {
        super.setColors(iArr);
        if (this.a != null) {
            this.a.a(getWidth(), getHeight(), getWidth(), getHeight());
        }
    }

    public boolean onKeyDown(int i, KeyEvent keyEvent) {
        boolean onKeyDown = super.onKeyDown(i, keyEvent);
        if (this.mKeyPressListener != null) {
            this.mKeyPressListener.onKeyPressed(i);
        }
        return onKeyDown;
    }

    public void setExtGestureListener(OnGestureListener onGestureListener) {
        this.d = onGestureListener;
        super.setExtGestureListener(onGestureListener);
    }

    public boolean onTouchEvent(MotionEvent motionEvent) {
        if (this.d == null || !(this.d instanceof anw)) {
            return super.onTouchEvent(motionEvent);
        }
        return ((anw) this.d).a(motionEvent) || super.onTouchEvent(motionEvent);
    }

    public void onLongPress(MotionEvent motionEvent) {
    }
}


smali里面看目录这一段是terminalview.java,我就看出来get字体,set大小。
 楼主| zixijian 发表于 2020-1-2 19:14
原来客户端内也可以调整,比如vim有ambi选项,我玩的tintin++可以用#sub指令替换显示,终端里面也就iterm2自带该功能。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 22:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表