В GTK, как мне ждать нажатия кнопки, пока основной l oop продолжается? - PullRequest
1 голос
/ 04 мая 2020

Я пишу симулятор Z80 с GUI, работающим на GTK (https://github.com/clancyj4/z80sim/tree/dev для заинтересованных).

Моя проблема в том, что мне нужно перехватить код операции IN и разрешить редактирование окна для предоставления кодов ввода-вывода. Позвольте мне показать вам, что у меня так далеко:

/* get a byte (char?) from the input part of the Port window */
/* What we really want to do is have a queue */

BYTE IOPort_IN(int port)
{
  char whole_buffer[IOINBUFLEN * 4];            /* 4x in case of Hex */
  BYTE c;
  int i;

  if (IOPort[port] == NULL)                             /* struct exists? */
    Create_IOPort_Struct(port);

  printf("IOPort_IN: port=%d in_len=%d in_ptr=%d\n",
        port, IOPort[port]->in_len, IOPort[port]->in_ptr);

  if (IOPort[port]->in_len == 0)
  {
    sprintf(tstr, "Port %d requires input", port);
    Add_to_Log(tstr);
    show_log(TRUE);
    gtk_text_buffer_set_text(inportprompt_textbuffer, "Input Required", -1);

/* somehow keep the gtk main loop running so the interface updates and allows the editing of the ioportin_textbuffer,
but wait for the input submission button the be pressed */

    i = gtk_text_buffer_get_char_count(ioportin_textbuffer);
    printf("in port buff len is %d.\n", i);
  }

  return(c);
}

Перехват кода операции в порядке, и эта функция вызывается. Проблема в том, что я понятия не имею, как реализовать комментарий в середине.

Цель состоит в том, чтобы остальная часть симуляции была в ожидании, но с основным GTK l oop все еще работающим, поэтому Окно журнала et c обновляется, и я могу ввести строку в окне ввода-вывода. Но он ждет, пока не будет нажата кнопка отправки. Я могу заморозить симуляцию Z80, установив флаг, так что это не проблема.

У меня неприятное ощущение, что я не очень хорошо выразил проблему, поэтому, пожалуйста, потерпите меня и задайте любые вопросы, которые могли бы прояснить ситуация.

Ура,

Джастин.

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Этот вопрос немного неясен. Это настроит обратный вызов для функции, она будет вызывать любую функцию, которую вы проходите через нее.

void button_connect_callback(GtkWidget *button, void *button_callback)
{
g_signal_connect(button, "clicked", G_CALLBACK(button_callback), NULL);
}

У меня есть несколько руководств, которые могут помочь здесь

0 голосов
/ 06 мая 2020

Я обошел проблему и принудительно возвратил 00, если еще не было входной очереди. Конечно, с большим количеством предупреждений.

Я все еще хотел бы знать, как заставить GTK удерживать выполнение в главном потоке до тех пор, пока не будет активировано подокно. Когда я знаю, я положу ответ здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...