Home  >  Article  >  Backend Development  >  GoNCurses Refresh the background window after the foreground window is moved

GoNCurses Refresh the background window after the foreground window is moved

WBOY
WBOYforward
2024-02-10 13:24:09695browse

GoNCurses 在前台窗口移动后刷新后台窗口

php Editor Banana today introduces you to an interesting and practical technique, which is to use the GoNCurses library to refresh the background window after the front window is moved. GoNCurses is a ncurses library based on the Go language that can create graphical interfaces in the terminal. However, when we move the foreground window, the background window does not automatically refresh, which brings some inconvenience to our operations. By using the refresh method provided by GoNCurses, we can solve this problem and allow the background window to automatically refresh after the foreground window is moved to improve the user experience. Next, let’s take a closer look at how to implement this technique.

Question content

I'm trying to understand how ncurses works. Here's an example of what I'm trying to understand and make it work.

First is the idea:

  • Window 1 with background and printed text (stdscr)
  • Window 2 (swin) is located on window 1 with a different background
  • Move window 2 to window 1

This is the setting:

stdscr, _ := gc.init()
defer gc.end()
gc.echo(false)
gc.cursor(0)
gc.cbreak(true)

stdscr.setbackground('#')
stdscr.moveprint(12, 15, "abcdefghijklmnopq...")
stdscr.noutrefresh()

y, x := 10, 20
swin, _ := gc.newwindow(4, 8, y, x)
swin.keypad(true)
swin.setbackground('.')
swin.box(0, 0)
swin.noutrefresh()
gc.update()

There is also a very simple for loop that will help move the foreground window:

main:
for {
    // stdscr.erase()
    // stdscr.noutrefresh()
    swin.movewindow(y, x)
    swin.noutrefresh()

    gc.update()
    switch swin.getchar() {
    case gc.key_right:
        x++
    case gc.key_down:
        y++
    case 'q':
        break main
    }
}
swin.delete()
stdscr.delete()

Now when I move window 2, the one in the background doesn't refresh and leaves a trace:

##########################
#######┌┌┌┌┌──────┐#######
#######│││││......│#######
##abcde│││││......│...####
#######└└└└└──────┘#######
##########################
##########################

When I uncommented stdscr.erase() and stdscr.noutrefresh() I fixed the trace, but of course I lost all the data on the background window, e.g. Text"abcdefghijklmnopq...": p>

#####################
#######┌──────┐######
#######│......│######
#######│......│######
#######└──────┘######
#####################
#####################

I tried making window 2 as a child window of the main window, but without success. How can I solve/deal with this problem? How is overlapping windows typically managed using ncurses? Thanks!

Workaround

curses are not directly supported (see the Panel library. Otherwise, you must use touchwin as a workaround Method (done using dialog and cdk).

The above is the detailed content of GoNCurses Refresh the background window after the foreground window is moved. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete