ncurses库我想知道鼠标反应不佳的原因

ncurses library I want to know the cause of poor mouse response

[我是日本人,使用 google 翻译]

我想知道的

我想知道鼠标反应不佳的原因

当前状态

实现鼠标长按判断释放按键时 检测工作不正常。是注释/////部分的代码。
※问题出在Edit.cpp部分的注释部分

Edit.hpp

#include <stdlib.h>
#include <iostream>

#include "../lib/ncurses/include/curses.h"


#include "../header/Log.hpp"
#include "../header/Vector.hpp"
#include "../header/Edit.hpp"
#include "../header/Screen.hpp"
#include "../header/Character.hpp"
#include "../header/Color.hpp"

#define UP_KEY ((int)259)
#define LEFT_KEY ((int)260)
#define RIGHT_KEY ((int)261)
#define DOWN_KEY ((int)258)

#define ESC_KEY ((int)27)

#define TERMIMAL_DEFAUT_COLOR ((int)8)

// ######################## コンストラクタ ######################## 
Edit::Edit() : Scene()
{
    holdPressed = 0;

    position.x = 0;
    position.y = 0;
    
    int t = 1;
    for(int i = 0; i < TERMIMAL_DEFAUT_COLOR; i++)
    {
        for(int j = 0; j < TERMIMAL_DEFAUT_COLOR; j++)
        {           
            init_pair(t, i, j);
            t++;
        }
    }


    screen = std::make_unique<Screen>();    //前景



    changeScene = Scene::SceneType::Edit;   //現在のシーン
}

// ######################## Keyboard Input ######################## 
void Edit::KeyInput()
{


    int key = getch();
    //Print("%d\n",key);
    switch(key)
    {
        case KEY_LEFT:
        {
            position.x--;
        }
        break;

        case KEY_RIGHT:
        {
            position.x++;
        }
        break;

        case KEY_DOWN:
        {
            position.y++;
        }
        break;

        case KEY_UP:
        {
            position.y--;
        }
        break;
    }


    //書き込み
    if(key == ' ')
    {
        screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});   
    }
    




    //ESCで終了
    if(key == ESC_KEY)
    {
        changeScene = Scene::SceneType::Exit;
    }
}

// ######################## Update ######################## 
void Edit::Update()
{
    screen->Update();   //スクリーン更新
    


    MouseInput();   //マウス入力
    KeyInput();     //キー入力

    move(position.y,position.x);    //カーソル移動
}

// ######################## Renderer ######################## 
void Edit::Renderer()const
{
    screen->Renderer();
}


// ######################## Mouse Input ######################## 
void Edit::MouseInput()
{
    
    //マウス移動イベント
    if(getmouse(&mouseEvent) == OK)
    {
        //マウス座標
        if(mouseEvent.bstate & REPORT_MOUSE_POSITION)
        {
            position.x = mouseEvent.x;
            position.y = mouseEvent.y;
        }           
    }
    
////////////////////////////////////////////////////////////////////////////////////
    //長押し判定
    if(prevClickEvent.bstate & BUTTON1_PRESSED)
    {
        holdPressed++;
        if(holdPressed > 5)
        {
            prevClickEvent.bstate = BUTTON1_PRESSED;
            screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
            holdPressed = 21;
        }
    }
    else
    {
        prevClickEvent.bstate = 0;
        holdPressed = 0;
    }
    

    //クリックイベント
    if(getmouse(&clickEvent) == OK)
    {
        //Left Click
        if(clickEvent.bstate & BUTTON1_PRESSED )
        {
            prevClickEvent.bstate = BUTTON1_PRESSED;
            screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        else if(clickEvent.bstate & BUTTON1_RELEASED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
            prevClickEvent.bstate = 0;
        }       
        else if(clickEvent.bstate & BUTTON1_CLICKED)
        {
            ///screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        else if(clickEvent.bstate & BUTTON1_DOUBLE_CLICKED)
        {
            ///screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        else if(clickEvent.bstate & BUTTON1_TRIPLE_CLICKED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        

        //Right Click
        if(clickEvent.bstate & BUTTON1_PRESSED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        else if(clickEvent.bstate & BUTTON1_RELEASED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }               
        else if(clickEvent.bstate & BUTTON1_DOUBLE_CLICKED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }           
        else if(clickEvent.bstate & BUTTON1_TRIPLE_CLICKED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
        else if(clickEvent.bstate & BUTTON1_CLICKED)
        {
            //screen->Input(position.x,position.y,Character{Color::WHITE_BLACK,'@',0});
        }       
    }
    
///////////////////////////////////////////////////////////////////////////////////////
}


// ######################## デストラクタ ######################## 
Edit::~Edit()
{

}


Screen.cpp

#include "../header/Screen.hpp"


#include "../header/Character.hpp"
#include "../header/Color.hpp"
#include "../header/Vector.hpp"
#include "../header/Screen.hpp"



// ######################## コンストラクタ ######################## 
Screen::Screen()
{

      //ウインドウ初期化
    getmaxyx(stdscr,windowSize.y,windowSize.x);
    window = newpad(windowSize.y,windowSize.x);
    prefresh(window,0,0,0,0,windowSize.y,windowSize.x);


      size.x = windowSize.x;
      size.y = windowSize.y;
      maxSize = size.x * size.y;

      stage = std::make_unique<std::vector<Character>>(size.x * size.y);
      
      for(std::vector<Character>::iterator itr = stage->begin(); itr != stage->end(); itr++)
      {
            itr->chr = ' ';
            itr->color = Color::NONE;
            itr->type = 0;
      }
}



// ######################## 画面サイズ更新 ########################
void Screen::UpdateScreen()
{
      //画面サイズを取得
      getmaxyx(stdscr,windowSize.y,windowSize.x);
      
      //前のウインドウサイズをより大きければ要素を代入
      if((windowSize.x * windowSize.y) > maxSize) 
      {
            maxSize = windowSize.x * windowSize.y;
            size.x = windowSize.x;
            size.y = windowSize.y;

            for(int i = 0; i< (windowSize.x * windowSize.y); i++)
            {
                  stage->emplace_back(Character{Color::NONE,' ',0});
            }
      }
}



// ######################## Update ########################
void Screen::Update()
{
      UpdateScreen();   //画面サイズを更新
}

// ######################## 文字設定 ######################## 
void Screen::Input(int x,int y,Character c)
{
      stage->at((y * size.x) + x) = c;
}

// ######################## 文字削除 ######################## 
void Screen::Delete(int x,int y)
{
      stage->at((y * size.x) + x).chr = ' ';
      stage->at((y * size.x) + x).color = Color::NONE;
      stage->at((y * size.x) + x).type = 0;
}

// ######################## Renderer ######################## 
void Screen::Renderer()const
{

      for(int y = 0; y < size.y; y++)
      {
            for(int x = 0; x < size.x; x++)
            {
                attron(COLOR_PAIR(stage->at((y * size.x) + x).color));
                attron(stage->at((y * size.x) + x).type);

                  mvwaddch(window,y,x,stage->at((y * size.x) + x).chr);

                attroff(stage->at(y * x).type);
                attroff(COLOR_PAIR(stage->at((y * size.x) + x).color));
            }
      }

    prefresh(window,0,0,0,0,windowSize.y,windowSize.x);      
}

// ######################## デストラクタ ######################## 
Screen::~Screen()
{


}

该示例不完整,但我没有看到对 KEY_MOUSE return 的检查来自 getch。在这种情况发生之前,ncurses 不会准备好 return getmouse 中的有用信息。