FLTK - 在句柄内抛出一个异常

时间:2016-06-16 11:42:36

标签: c++ exception-handling fltk

我正在使用FLTK 1.3.3,我有一段看起来像这样的代码:

class MyWidget: public Fl_Widget
{
private:
  virtual int handle(int) override;
  void ParseClipboardText(const char *);

public:
  // ...
};

int MyWidget::handle(int event)
{
if (event==FL_PASTE)
  {
  ParseClipboardText(Fl::event_text()); // May throw
  return 1;
  }
return Fl_Widget::handle(event);
}

问题是如果抛出异常,handle不会返回,并且剪贴板文本似乎没有被释放(我无法再复制到剪贴板)。

我尝试了一种可行的解决方法但没有成功:

class MyWidget: public Fl_Widget
{
private:
  std::string textBuffer;

private:
  static void MyCallBack(Fl_Widget *,void *);
  virtual int handle(int) override;
  void ParseClipboardText(const std::string &);

public:
  MyWidget();
};

MyWidget::MyWidget()
{
callback(&MyCallBack);
when(FL_WHEN_CHANGED);
// ...
}

int MyWidget::handle(int event)
{
if (event==FL_PASTE)
  {
  textBuffer= Fl::event_text();
  set_changed();
  return 1;
  }
return Fl_Widget::handle(event);
}

void MyWidget::MyCallBack(Fl_Widget *pw,void *)
{
  MyWidget *pmw= static_cast<MyWidget *>(pw);

  pmw->ParseClipboardText(pmw->textBuffer);
}

有没有办法安排在handle返回后立即调用回调函数?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案似乎涉及在redraw中调用damage(或更好handle),然后在draw方法中调用潜在投掷函数,{{1}已完成。

不发布剪贴板内容的问题发生在Windows下,但不发生在Linux下。