vercel / hyper

A terminal built on web technologies
https://hyper.is
MIT License
43.27k stars 3.52k forks source link

`ioctl` system call returning the wrong result #7375

Open sxyazi opened 1 year ago

sxyazi commented 1 year ago

Issue

Can't use ioctl to get the correct value of xpixel and ypixel:

let s = unsafe {
    let s: winsize = std::mem::zeroed();
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &s);
    s
};
dbg!(s.ws_col, s.ws_row, s.ws_xpixel, s.ws_ypixel);
image

There are both zero, which causes some apps don't work.


{
  "updateChannel": "stable",
  "fontSize": 12,
  "fontFamily": "Menlo, \"DejaVu Sans Mono\", Consolas, \"Lucida Console\", monospace",
  "fontWeight": "normal",
  "fontWeightBold": "bold",
  "lineHeight": 1,
  "letterSpacing": 0,
  "cursorColor": "rgba(248,28,229,0.8)",
  "cursorAccentColor": "#000",
  "cursorShape": "BLOCK",
  "cursorBlink": false,
  "foregroundColor": "#fff",
  "backgroundColor": "#000",
  "selectionColor": "rgba(248,28,229,0.3)",
  "borderColor": "#333",
  "css": "",
  "termCSS": "",
  "workingDirectory": "",
  "showHamburgerMenu": "",
  "showWindowControls": "",
  "padding": "12px 14px",
  "colors": {
    "black": "#000000",
    "red": "#C51E14",
    "green": "#1DC121",
    "yellow": "#C7C329",
    "blue": "#0A2FC4",
    "magenta": "#C839C5",
    "cyan": "#20C5C6",
    "white": "#C7C7C7",
    "lightBlack": "#686868",
    "lightRed": "#FD6F6B",
    "lightGreen": "#67F86F",
    "lightYellow": "#FFFA72",
    "lightBlue": "#6A76FB",
    "lightMagenta": "#FD7CFC",
    "lightCyan": "#68FDFE",
    "lightWhite": "#FFFFFF",
    "limeGreen": "#32CD32",
    "lightCoral": "#F08080"
  },
  "shell": "",
  "shellArgs": [
    "--login"
  ],
  "env": {},
  "bell": "SOUND",
  "copyOnSelect": false,
  "defaultSSHApp": true,
  "quickEdit": false,
  "macOptionSelectionMode": "vertical",
  "webGLRenderer": true,
  "webLinksActivationKey": "",
  "disableLigatures": true,
  "disableAutoUpdates": false,
  "screenReaderMode": false,
  "preserveCWD": true
}

plugins ```json { "plugins": [], "localPlugins": [] } ```
jerch commented 1 year ago

There are both zero, which causes some apps don't work.

Apps must not rely on correct pixel propagation by TIOCGWINSZ. These values are intended to be 0 as a fallback Even worse - there are systems, that cannot tell a pixel size at all.

So its not returning a wrong result here, but telling you - "dont know the right value". Would be nice to see this getting fixed yes, but imho thats an issue with node-pty.

sxyazi commented 1 year ago

there are systems, that cannot tell a pixel size at all

Is it a non-Unix system, like Windows?

I'm developing a terminal file manager, and when I test its image preview feature, I find that I can't run it in Hyper. I need to get the actual pixel size to calculate the image's width and height -- I'm not sure how else can get it done.

jerch commented 1 year ago

You can also use CSI 14 t to request the current text area size in pixels.

sxyazi commented 1 year ago

After testing, Hyper doesn't even support CSI 14 t:

image

But VSCode supports it -- which also uses node-pty and does not fully implement TIOCGWINSZ:

image
jerch commented 1 year ago

Are you on latest canary? CSI 14 t gets activated by the recently added image support and prolly will not work with older versions.

sxyazi commented 1 year ago

I did a quick test on the latest canary, it supports CSI 14 t now!