summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/unx/gtk/gtkdata.hxx2
-rw-r--r--vcl/inc/unx/gtk/gtkframe.hxx7
-rw-r--r--vcl/unx/gtk3/gtk3gtkdata.cxx4
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx75
4 files changed, 58 insertions, 30 deletions
diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx
index f5e1e03a6674..ffb0fb700718 100644
--- a/vcl/inc/unx/gtk/gtkdata.hxx
+++ b/vcl/inc/unx/gtk/gtkdata.hxx
@@ -97,6 +97,7 @@ class GtkData : public SalGenericData
GSource* m_pUserEvent;
osl::Mutex m_aDispatchMutex;
oslCondition m_aDispatchCondition;
+ css::uno::Any m_aException;
bool blockIdleTimeout;
public:
@@ -120,6 +121,7 @@ public:
inline GtkSalDisplay *GetGtkDisplay() const;
bool BlockIdleTimeout() const { return blockIdleTimeout; }
+ void setException(const css::uno::Any& rException) { m_aException = rException; }
};
class GtkSalFrame;
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 0cdff6c85494..40ae9e28e453 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -539,6 +539,13 @@ public:
sal_uIntPtr GetNativeWindowHandle(GtkWidget *pWidget);
virtual sal_uIntPtr GetNativeWindowHandle() override;
+ //Call the usual SalFrame Callback, but catch uno exceptionss and delegate
+ //to GtkData to rethrow them after the gsignal is processed when its safe
+ //to do so again in our own code after the g_main_context_iteration call
+ //which triggers the gsignals.
+ long CallCallbackExc(SalEvent nEvent, const void* pEvent) const;
+
+
static void KeyCodeToGdkKey(const vcl::KeyCode& rKeyCode,
guint* pGdkKeyCode, GdkModifierType *pGdkModifiers);
diff --git a/vcl/unx/gtk3/gtk3gtkdata.cxx b/vcl/unx/gtk3/gtk3gtkdata.cxx
index 17cad89f1b45..70f9249b12c7 100644
--- a/vcl/unx/gtk3/gtk3gtkdata.cxx
+++ b/vcl/unx/gtk3/gtk3gtkdata.cxx
@@ -51,6 +51,8 @@
# include <gdk/gdkx.h>
#endif
+#include <cppuhelper/exc_hlp.hxx>
+
using namespace vcl_sal;
/***************************************************************
@@ -478,6 +480,8 @@ SalYieldResult GtkData::Yield( bool bWait, bool bHandleAllCurrentEvents )
if( wasOneEvent )
bWasEvent = true;
}
+ if (m_aException.hasValue())
+ ::cppu::throwException(m_aException);
}
else if( bWait )
{
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 9fc972dad2d9..e5ddb072cf57 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -37,6 +37,7 @@
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
#include <vcl/settings.hxx>
+#include <cppuhelper/exc_hlp.hxx>
#include <config_gio.h>
@@ -453,7 +454,7 @@ void GtkSalFrame::doKeyCallback( guint state,
if( bDown )
{
- bool bHandled = CallCallback( SalEvent::KeyInput, &aEvent );
+ bool bHandled = CallCallbackExc( SalEvent::KeyInput, &aEvent );
// #i46889# copy AlternateKeyCode handling from generic plugin
if( ! bHandled )
{
@@ -463,16 +464,16 @@ void GtkSalFrame::doKeyCallback( guint state,
aEvent.mnCode = aAlternate.nKeyCode;
if( aAlternate.nCharCode )
aEvent.mnCharCode = aAlternate.nCharCode;
- CallCallback( SalEvent::KeyInput, &aEvent );
+ CallCallbackExc( SalEvent::KeyInput, &aEvent );
}
}
if( bSendRelease && ! aDel.isDeleted() )
{
- CallCallback( SalEvent::KeyUp, &aEvent );
+ CallCallbackExc( SalEvent::KeyUp, &aEvent );
}
}
else
- CallCallback( SalEvent::KeyUp, &aEvent );
+ CallCallbackExc( SalEvent::KeyUp, &aEvent );
}
GtkSalFrame::GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle )
@@ -2611,7 +2612,7 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
if (!aDel.isDeleted())
{
- pThis->CallCallback( nEventType, &aEvent );
+ pThis->CallCallbackExc( nEventType, &aEvent );
}
return true;
@@ -2651,7 +2652,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
if (aEvent.mnScrollLines == 0)
aEvent.mnScrollLines = 1;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
}
if (pEvent->delta_y != 0.0)
@@ -2665,7 +2666,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
if (aEvent.mnScrollLines == 0)
aEvent.mnScrollLines = 1;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
}
break;
@@ -2675,7 +2676,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
aEvent.mnNotchDelta = 1;
aEvent.mnScrollLines = 3;
aEvent.mbHorz = false;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
break;
case GDK_SCROLL_DOWN:
@@ -2683,7 +2684,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
aEvent.mnNotchDelta = -1;
aEvent.mnScrollLines = 3;
aEvent.mbHorz = false;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
break;
case GDK_SCROLL_LEFT:
@@ -2691,7 +2692,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
aEvent.mnNotchDelta = 1;
aEvent.mnScrollLines = 3;
aEvent.mbHorz = true;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
break;
case GDK_SCROLL_RIGHT:
@@ -2699,7 +2700,7 @@ gboolean GtkSalFrame::signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer
aEvent.mnNotchDelta = -1;
aEvent.mnScrollLines = 3;
aEvent.mbHorz = true;
- pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
+ pThis->CallCallbackExc(SalEvent::WheelMouse, &aEvent);
break;
}
@@ -2724,7 +2725,7 @@ void GtkSalFrame::gestureSwipe(GtkGestureSwipe* gesture, gdouble velocity_x, gdo
aEvent.mnX = x;
aEvent.mnY = y;
- pThis->CallCallback(SalEvent::Swipe, &aEvent);
+ pThis->CallCallbackExc(SalEvent::Swipe, &aEvent);
}
}
@@ -2742,7 +2743,7 @@ void GtkSalFrame::gestureLongPress(GtkGestureLongPress* gesture, gpointer frame)
aEvent.mnX = x;
aEvent.mnY = y;
- pThis->CallCallback(SalEvent::LongPress, &aEvent);
+ pThis->CallCallbackExc(SalEvent::LongPress, &aEvent);
}
}
@@ -2774,7 +2775,7 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer
vcl::DeletionListener aDel( pThis );
- pThis->CallCallback( SalEvent::MouseMove, &aEvent );
+ pThis->CallCallbackExc( SalEvent::MouseMove, &aEvent );
if( ! aDel.isDeleted() )
{
@@ -2784,7 +2785,7 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer
{
pThis->maGeometry.nX = frame_x;
pThis->maGeometry.nY = frame_y;
- pThis->CallCallback( SalEvent::Move, nullptr );
+ pThis->CallCallbackExc( SalEvent::Move, nullptr );
}
if( ! aDel.isDeleted() )
@@ -2811,7 +2812,7 @@ gboolean GtkSalFrame::signalCrossing( GtkWidget*, GdkEventCrossing* pEvent, gpoi
aEvent.mnCode = GetMouseModCode( pEvent->state );
aEvent.mnButton = 0;
- pThis->CallCallback( (pEvent->type == GDK_ENTER_NOTIFY) ? SalEvent::MouseMove : SalEvent::MouseLeave, &aEvent );
+ pThis->CallCallbackExc( (pEvent->type == GDK_ENTER_NOTIFY) ? SalEvent::MouseMove : SalEvent::MouseLeave, &aEvent );
return true;
}
@@ -2858,7 +2859,7 @@ void GtkSalFrame::sizeAllocated(GtkWidget*, GdkRectangle *pAllocation, gpointer
pThis->maGeometry.nWidth = pAllocation->width;
pThis->maGeometry.nHeight = pAllocation->height;
pThis->AllocateFrame();
- pThis->CallCallback( SalEvent::Resize, nullptr );
+ pThis->CallCallbackExc( SalEvent::Resize, nullptr );
pThis->TriggerPaintEvent();
}
@@ -2891,7 +2892,7 @@ gboolean GtkSalFrame::signalConfigure(GtkWidget*, GdkEventConfigure* pEvent, gpo
pThis->updateScreenNumber();
if (bMoved)
- pThis->CallCallback(SalEvent::Move, nullptr);
+ pThis->CallCallbackExc(SalEvent::Move, nullptr);
return false;
}
@@ -2912,7 +2913,7 @@ void GtkSalFrame::TriggerPaintEvent()
//that duplicates the amount of drawing and is hideously slow
SAL_INFO("vcl.gtk3", "force painting" << 0 << "," << 0 << " " << maGeometry.nWidth << "x" << maGeometry.nHeight);
SalPaintEvent aPaintEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight, true);
- CallCallback(SalEvent::Paint, &aPaintEvt);
+ CallCallbackExc(SalEvent::Paint, &aPaintEvt);
gtk_widget_queue_draw(GTK_WIDGET(m_pFixedContainer));
}
@@ -2946,7 +2947,7 @@ gboolean GtkSalFrame::signalFocus( GtkWidget*, GdkEventFocus* pEvent, gpointer f
// in the meantime do not propagate focus get/lose if floats are open
if( m_nFloats == 0 )
- pThis->CallCallback( pEvent->in ? SalEvent::GetFocus : SalEvent::LoseFocus, nullptr );
+ pThis->CallCallbackExc( pEvent->in ? SalEvent::GetFocus : SalEvent::LoseFocus, nullptr );
return false;
}
@@ -2955,7 +2956,7 @@ gboolean GtkSalFrame::signalMap(GtkWidget *, GdkEvent*, gpointer frame)
{
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
- pThis->CallCallback( SalEvent::Resize, nullptr );
+ pThis->CallCallbackExc( SalEvent::Resize, nullptr );
pThis->TriggerPaintEvent();
return false;
@@ -2965,7 +2966,7 @@ gboolean GtkSalFrame::signalUnmap( GtkWidget*, GdkEvent*, gpointer frame )
{
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
- pThis->CallCallback( SalEvent::Resize, nullptr );
+ pThis->CallCallbackExc( SalEvent::Resize, nullptr );
return false;
}
@@ -3068,7 +3069,7 @@ gboolean GtkSalFrame::signalKey(GtkWidget* pWidget, GdkEventKey* pEvent, gpointe
aModEvt.mnTime = pEvent->time;
aModEvt.mnModKeyCode = pThis->m_nKeyModifiers;
- pThis->CallCallback( SalEvent::KeyModChange, &aModEvt );
+ pThis->CallCallbackExc( SalEvent::KeyModChange, &aModEvt );
}
else
@@ -3101,7 +3102,7 @@ gboolean GtkSalFrame::signalDelete( GtkWidget*, GdkEvent*, gpointer frame )
if (bBackDrop)
pThis->GetWindow()->Enable();
- pThis->CallCallback( SalEvent::Close, nullptr );
+ pThis->CallCallbackExc( SalEvent::Close, nullptr );
return true;
}
@@ -3545,13 +3546,13 @@ void GtkSalFrame::IMHandler::deleteIMContext()
void GtkSalFrame::IMHandler::doCallEndExtTextInput()
{
m_aInputEvent.mpTextAttr = nullptr;
- m_pFrame->CallCallback( SalEvent::EndExtTextInput, nullptr );
+ m_pFrame->CallCallbackExc( SalEvent::EndExtTextInput, nullptr );
}
void GtkSalFrame::IMHandler::updateIMSpotLocation()
{
SalExtTextInputPosEvent aPosEvent;
- m_pFrame->CallCallback( SalEvent::ExtTextInputPos, static_cast<void*>(&aPosEvent) );
+ m_pFrame->CallCallbackExc( SalEvent::ExtTextInputPos, static_cast<void*>(&aPosEvent) );
GdkRectangle aArea;
aArea.x = aPosEvent.mnX;
aArea.y = aPosEvent.mnY;
@@ -3571,9 +3572,9 @@ void GtkSalFrame::IMHandler::sendEmptyCommit()
aEmptyEv.maText.clear();
aEmptyEv.mnCursorPos = 0;
aEmptyEv.mnCursorFlags = 0;
- m_pFrame->CallCallback( SalEvent::ExtTextInput, static_cast<void*>(&aEmptyEv) );
+ m_pFrame->CallCallbackExc( SalEvent::ExtTextInput, static_cast<void*>(&aEmptyEv) );
if( ! aDel.isDeleted() )
- m_pFrame->CallCallback( SalEvent::EndExtTextInput, nullptr );
+ m_pFrame->CallCallbackExc( SalEvent::EndExtTextInput, nullptr );
}
void GtkSalFrame::IMHandler::endExtTextInput( EndExtTextInputFlags /*nFlags*/ )
@@ -3788,7 +3789,7 @@ void GtkSalFrame::IMHandler::signalIMCommit( GtkIMContext* /*pContext*/, gchar*
}
if( ! bSingleCommit )
{
- pThis->m_pFrame->CallCallback( SalEvent::ExtTextInput, static_cast<void*>(&pThis->m_aInputEvent));
+ pThis->m_pFrame->CallCallbackExc( SalEvent::ExtTextInput, static_cast<void*>(&pThis->m_aInputEvent));
if( ! aDel.isDeleted() )
pThis->doCallEndExtTextInput();
}
@@ -3902,7 +3903,7 @@ void GtkSalFrame::IMHandler::signalIMPreeditChanged( GtkIMContext*, gpointer im_
SolarMutexGuard aGuard;
vcl::DeletionListener aDel( pThis->m_pFrame );
- pThis->m_pFrame->CallCallback( SalEvent::ExtTextInput, static_cast<void*>(&pThis->m_aInputEvent));
+ pThis->m_pFrame->CallCallbackExc( SalEvent::ExtTextInput, static_cast<void*>(&pThis->m_aInputEvent));
if( bEndPreedit && ! aDel.isDeleted() )
pThis->doCallEndExtTextInput();
if( ! aDel.isDeleted() )
@@ -4210,5 +4211,19 @@ void GtkSalFrame::signalDragDataGet(GtkWidget* /*widget*/, GdkDragContext* /*con
pThis->m_pDragSource->dragDataGet(data, info);
}
+long GtkSalFrame::CallCallbackExc(SalEvent nEvent, const void* pEvent) const
+{
+ long nRet = 0;
+ try
+ {
+ nRet = CallCallback(nEvent, pEvent);
+ }
+ catch (const css::uno::Exception&)
+ {
+ GtkData *pSalData = static_cast<GtkData*>(GetSalData());
+ pSalData->setException(::cppu::getCaughtException());
+ }
+ return nRet;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */