2

gtk+2.0とgtksourceview2.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: %s\n", "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("INSERT\t\t 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がテキストバッファに配置されないようにするにはどうすればよいですか?

4

2 に答える 2

3

イベントのそれ以上の処理をブロックするTRUE代わりに、イベントハンドラーから戻ります。FALSEイベントハンドラーはフィルターのように機能し、テキストビューに渡したくないキーストロークをフィルターで除外します。

PS。65307、useなどの定数は使用しないでくださいGDK_KEY_Escape

于 2012-06-06T16:03:04.060 に答える
0

この質問を書き終えるとすぐに、実行可能なオプションが頭に浮かびます。これがおそらくkey_release_event作成された理由です。チャームのように働いた。

于 2012-06-06T05:57:34.810 に答える