Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting terminal size in c for windows?

How to check ymax and xmax in a console window, under Windows, using plain c?

There is this piece of code for linux:

#include <stdio.h> #include <sys/ioctl.h> int main (void) {     struct winsize max;     ioctl(0, TIOCGWINSZ , &max);     printf ("lines %d\n", max.ws_row);     printf ("columns %d\n", max.ws_col); } 

Now I wonder how can I do the same for windows. I tried winioctl.h but it does not define struct winsize nor any other with a similar name.

Any tips? Thanks.

PS. In linux you also can find the console size using getenv("LINES");. Is there a similar variable under windows?

PPS. Also, there is always ncurses.h, that I suppose work both systems, but I'm avoiding it because of conflicts with other libraries I have.

PPPS. This question here Getting terminal width in C? has a lot of tips, so no need to repeat that.

like image 714
DrBeco Avatar asked Jul 25 '11 05:07

DrBeco


1 Answers

This prints the size of the console, not the buffer:

#include <windows.h>  int main(int argc, char *argv[]) {     CONSOLE_SCREEN_BUFFER_INFO csbi;     int columns, rows;      GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);     columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;     rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;      printf("columns: %d\n", columns);     printf("rows: %d\n", rows);     return 0; } 

This code works because srWindow "contains the console screen buffer coordinates of the upper-left and lower-right corners of the display window", and the SMALL_RECT structure "specify the rows and columns of screen-buffer character cells" according to MSDN. I subtracted the parallel sides to get the size of the console window. Since I got 1 less than the actual value, I added one.

like image 59
quantum Avatar answered Sep 18 '22 22:09

quantum