C - GTK+文本编辑器vim类型模式(插入/命令)



我正在尝试在我在gtk+ 2.0和gtksourceview 2.0中创建的文本编辑器中加入类似vim的功能。 我让它工作,除非我按"i"进入插入模式,它正确进入此模式,但随后它在文本缓冲区中键入"i"。 这是我的按键功能,它设置为在按下 esc 键时进入命令模式(离开插入模式),正如我之前所说,在按下 i 键时进入插入模式:

gboolean on_key_press_win_main (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
  switch (event->keyval)
  {
    case GDK_i:
      if (event->state & GDK_CONTROL_MASK)
      {
        printf("key pressed: %sn", "ctrl + i");
      }
      else
      {
        GtkTextBuffer *tbuffer;
                GtkTextView *text_view;
                int page = 0;
        gchar *msg;
        gint row, col;
        GtkTextIter iter;
              page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
                text_view = GTK_TEXT_VIEW(txtinput[notebookPages[page]]);
                tbuffer = gtk_text_view_get_buffer (text_view);
        if (insert_mode == 0)
        {
            insert_mode = 1;
            command_mode = 0;
            /* update statusbar */
            gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 0); 
            gtk_text_buffer_get_iter_at_mark(tbuffer, &iter, gtk_text_buffer_get_insert(tbuffer));
            row = gtk_text_iter_get_line(&iter);
            col = gtk_text_iter_get_line_offset(&iter);
            msg = g_strdup_printf("INSERTtt Col %d Ln %d", col+1, row+1);
            gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);
            gtk_text_view_set_editable (text_view, TRUE);
        }
      }
      break;
        /* esc key */
        case 65307:
    {
        GtkTextBuffer *tbuffer;
          GtkTextView *text_view;
          int page = 0;
      gchar *msg;
      gint row, col;
      GtkTextIter iter;
        page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
          text_view = GTK_TEXT_VIEW(txtinput[notebookPages[page]]);
          tbuffer = gtk_text_view_get_buffer (text_view);
      insert_mode = 0;
      command_mode = 1;
      gtk_text_view_set_editable (text_view, FALSE);
      /* update statusbar */
      gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 0); 
      gtk_text_buffer_get_iter_at_mark(tbuffer, &iter, gtk_text_buffer_get_insert(tbuffer));
      row = gtk_text_iter_get_line(&iter);
      col = gtk_text_iter_get_line_offset(&iter);
      msg = g_strdup_printf("Col %d Ln %d", col+1, row+1);
      gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);
    }
    break;
    default:
      return FALSE; 
  }
  return FALSE; 
}

如您所见,进入命令模式时设置gtk_text_view_set_editable (text_view, FALSE),进入插入模式时设置gtk_text_view_set_editable (text_view, TRUE)。 但是,当进入插入模式时,text_view在击键在缓冲区中注册之前设置为可编辑,即使它是按键情况下的最后一个命令。如何防止 i 在进入插入模式时被放置在文本缓冲区中?

从事件处理程序返回TRUE,而不是FALSE阻止对事件的任何进一步处理。事件处理程序的工作方式类似于筛选器,您可以筛选出不想传递给文本视图的击键。

不要使用像65307这样的常量,使用GDK_KEY_Escape或其他任何东西。

你不知道吗,当我写完这个问题时,一个可行的选择突然出现在我的脑海中。 这可能就是创建key_release_event的原因。 像魅力一样工作。

相关内容

  • 没有找到相关文章

最新更新