diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/ev/unix/ev_UnixMenu.cpp abi-focus/src/af/ev/unix/ev_UnixMenu.cpp --- abi/src/af/ev/unix/ev_UnixMenu.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/ev/unix/ev_UnixMenu.cpp Wed May 10 16:24:38 2000 @@ -76,7 +76,6 @@ XAP_UnixFrame * pFrame = wd->m_pUnixMenu->getFrame(); UT_ASSERT(pFrame); - EV_Menu_Label * pLabel = wd->m_pUnixMenu->getMenuLabelSet()->getLabel(wd->m_id); if (!pLabel) { diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/util/unix/ut_dialogHelper.cpp abi-focus/src/af/util/unix/ut_dialogHelper.cpp --- abi/src/af/util/unix/ut_dialogHelper.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/util/unix/ut_dialogHelper.cpp Wed May 10 16:24:38 2000 @@ -30,11 +30,55 @@ #include "ut_debugmsg.h" #include "ut_assert.h" #include "ut_string.h" +#include"xav_View.h" +#include"xap_Frame.h" // default GTK message box button width, in GTK screen units (pixels) #define DEFAULT_BUTTON_WIDTH 85 /*****************************************************************/ + +static gboolean focus_in_event(GtkWidget *widget,GdkEvent */*event*/,gpointer /*user_data*/) +{ + XAP_Frame *pFrame=(XAP_Frame *)gtk_object_get_data(GTK_OBJECT(widget), "frame"); + UT_ASSERT(pFrame); + pFrame->getCurrentView()->focusChange(AV_FOCUS_NEARBY); + return FALSE; +} + +static gboolean focus_out_event(GtkWidget *widget,GdkEvent */*event*/,gpointer /*user_data*/) +{ + XAP_Frame *pFrame=(XAP_Frame *)gtk_object_get_data(GTK_OBJECT(widget), "frame"); + UT_ASSERT(pFrame); + pFrame->getCurrentView()->focusChange(AV_FOCUS_NONE); + return FALSE; +} + +void connectFocus(GtkWidget *widget,const XAP_Frame *frame) +{ + gtk_object_set_data(GTK_OBJECT(widget), "frame", + (void *)frame); + gtk_signal_connect(GTK_OBJECT(widget), "focus_in_event", + GTK_SIGNAL_FUNC(focus_in_event), NULL); + gtk_signal_connect(GTK_OBJECT(widget), "focus_out_event", + GTK_SIGNAL_FUNC(focus_out_event), NULL); + gtk_signal_connect(GTK_OBJECT(widget), "destroy", + GTK_SIGNAL_FUNC(focus_out_event), NULL); +} + +UT_Bool isTransientWindow(GtkWindow *window,GtkWindow *parent) +{ + if(window) + { + while(window->transient_parent) + { + window=window->transient_parent; + if(window==parent) + return UT_TRUE; + } + } + return UT_FALSE; +} gint s_key_pressed(GtkWidget * /* widget */, GdkEventKey * e) { diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/util/unix/ut_dialogHelper.h abi-focus/src/af/util/unix/ut_dialogHelper.h --- abi/src/af/util/unix/ut_dialogHelper.h Wed May 10 15:50:16 2000 +++ abi-focus/src/af/util/unix/ut_dialogHelper.h Wed May 10 16:24:38 2000 @@ -22,6 +22,9 @@ #include #include +#include"ut_types.h" + +class XAP_Frame; // This macro sets up stack pointers to be used with the ConvertToUnixString // macro. @@ -34,6 +37,8 @@ UT_XML_cloneNoAmpersands(newstr, pSS->getValue(id)); \ } while (0) +void connectFocus(GtkWidget *widget,const XAP_Frame *frame); +UT_Bool isTransientWindow(GtkWindow *window,GtkWindow *parent); // This is a very thin message box; only use it for startup errors // or places where you can't use the message box class (like when diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_About.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_About.cpp --- abi/src/af/xap/unix/xap_UnixDlg_About.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_About.cpp Wed May 10 16:24:38 2000 @@ -122,6 +122,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // assemble an image _preparePicture(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_FileOpenSaveAs.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_FileOpenSaveAs.cpp --- abi/src/af/xap/unix/xap_UnixDlg_FileOpenSaveAs.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_FileOpenSaveAs.cpp Wed May 10 16:24:38 2000 @@ -456,6 +456,8 @@ GtkFileSelection *pFS = (GtkFileSelection *)gtk_file_selection_new(szTitle); + connectFocus(GTK_WIDGET(pFS),pFrame); + GtkWidget * filetypes_pulldown = NULL; /* diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_FontChooser.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_FontChooser.cpp --- abi/src/af/xap/unix/xap_UnixDlg_FontChooser.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_FontChooser.cpp Wed May 10 16:24:38 2000 @@ -693,6 +693,7 @@ // build the dialog GtkWidget * cf = constructWindow(); UT_ASSERT(cf); + connectFocus(GTK_WIDGET(cf),pFrame); // freeze updates of the preview m_blockUpdate = UT_TRUE; diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_Insert_Symbol.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_Insert_Symbol.cpp --- abi/src/af/xap/unix/xap_UnixDlg_Insert_Symbol.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_Insert_Symbol.cpp Wed May 10 16:24:38 2000 @@ -143,6 +143,9 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + + connectFocus(GTK_WIDGET(mainWindow),pFrame); + // To center the dialog, we need the frame of its parent. XAP_UnixFrame * pUnixFrame = static_cast(pFrame); UT_ASSERT(pUnixFrame); diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_MessageBox.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_MessageBox.cpp --- abi/src/af/xap/unix/xap_UnixDlg_MessageBox.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_MessageBox.cpp Wed May 10 16:24:38 2000 @@ -175,6 +175,7 @@ // New GTK+ dialog window GtkWidget * dialog_window = gtk_dialog_new(); + connectFocus(GTK_WIDGET(dialog_window),pFrame); gtk_signal_connect_after (GTK_OBJECT (dialog_window), "destroy", NULL, diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_Print.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_Print.cpp --- abi/src/af/xap/unix/xap_UnixDlg_Print.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_Print.cpp Wed May 10 16:24:38 2000 @@ -231,6 +231,7 @@ // Create window window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + connectFocus(GTK_WIDGET(window),pFrame); gtk_signal_connect_after(GTK_OBJECT(window), "destroy", NULL, @@ -507,6 +508,7 @@ gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parent)); gtk_widget_show (window); + gtk_grab_add(GTK_WIDGET(window)); gtk_main(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_WindowMore.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_WindowMore.cpp --- abi/src/af/xap/unix/xap_UnixDlg_WindowMore.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_WindowMore.cpp Wed May 10 16:24:38 2000 @@ -106,6 +106,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixDlg_Zoom.cpp abi-focus/src/af/xap/unix/xap_UnixDlg_Zoom.cpp --- abi/src/af/xap/unix/xap_UnixDlg_Zoom.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixDlg_Zoom.cpp Wed May 10 16:24:38 2000 @@ -153,6 +153,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixFrame.cpp abi-focus/src/af/xap/unix/xap_UnixFrame.cpp --- abi/src/af/xap/unix/xap_UnixFrame.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixFrame.cpp Wed May 10 16:24:38 2000 @@ -41,6 +41,25 @@ #define ENSUREP(p) do { UT_ASSERT(p); if (!p) goto Cleanup; } while (0) /****************************************************************/ +gboolean XAP_UnixFrame::_fe::focus_in_event(GtkWidget *w,GdkEvent */*event*/,gpointer /*user_data*/) +{ + XAP_UnixFrame * pFrame = (XAP_UnixFrame *)gtk_object_get_user_data(GTK_OBJECT(w)); + UT_ASSERT(pFrame); + gtk_object_set_data(GTK_OBJECT(w), "toplevelWindowFocus", + GINT_TO_POINTER(TRUE)); + pFrame->getCurrentView()->focusChange(gtk_grab_get_current()==NULL || gtk_grab_get_current()==w ? AV_FOCUS_HERE : AV_FOCUS_NEARBY); + return FALSE; +} + +gboolean XAP_UnixFrame::_fe::focus_out_event(GtkWidget *w,GdkEvent */*event*/,gpointer /*user_data*/) +{ + XAP_UnixFrame * pFrame = (XAP_UnixFrame *)gtk_object_get_user_data(GTK_OBJECT(w)); + UT_ASSERT(pFrame); + gtk_object_set_data(GTK_OBJECT(w), "toplevelWindowFocus", + GINT_TO_POINTER(FALSE)); + pFrame->getCurrentView()->focusChange(AV_FOCUS_NONE); + return FALSE; +} gint XAP_UnixFrame::_fe::button_press_event(GtkWidget * w, GdkEventButton * e) { @@ -332,6 +351,8 @@ m_wTopLevelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_object_set_data(GTK_OBJECT(m_wTopLevelWindow), "toplevelWindow", m_wTopLevelWindow); + gtk_object_set_data(GTK_OBJECT(m_wTopLevelWindow), "toplevelWindowFocus", + GINT_TO_POINTER(FALSE)); gtk_object_set_user_data(GTK_OBJECT(m_wTopLevelWindow),this); gtk_window_set_title(GTK_WINDOW(m_wTopLevelWindow), m_pUnixApp->getApplicationTitleForTitleBar()); @@ -350,6 +371,11 @@ // or if we return 'FALSE' in the "delete_event" callback. gtk_signal_connect(GTK_OBJECT(m_wTopLevelWindow), "destroy", GTK_SIGNAL_FUNC(_fe::destroy), NULL); + + gtk_signal_connect(GTK_OBJECT(m_wTopLevelWindow), "focus_in_event", + GTK_SIGNAL_FUNC(_fe::focus_in_event), NULL); + gtk_signal_connect(GTK_OBJECT(m_wTopLevelWindow), "focus_out_event", + GTK_SIGNAL_FUNC(_fe::focus_out_event), NULL); // create a VBox inside it. diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/unix/xap_UnixFrame.h abi-focus/src/af/xap/unix/xap_UnixFrame.h --- abi/src/af/xap/unix/xap_UnixFrame.h Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/unix/xap_UnixFrame.h Wed May 10 16:24:38 2000 @@ -113,6 +113,8 @@ static void vScrollChanged(GtkAdjustment * w, gpointer /*data*/); static void hScrollChanged(GtkAdjustment * w, gpointer /*data*/); static void destroy (GtkWidget * /*widget*/, gpointer /*data*/); + static gboolean focus_in_event(GtkWidget *w,GdkEvent *event,gpointer user_data); + static gboolean focus_out_event(GtkWidget *w,GdkEvent *event,gpointer user_data); }; }; diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/win/xap_Win32Frame.cpp abi-focus/src/af/xap/win/xap_Win32Frame.cpp --- abi/src/af/xap/win/xap_Win32Frame.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/win/xap_Win32Frame.cpp Wed May 10 16:27:06 2000 @@ -75,8 +75,10 @@ /*****************************************************************/ XAP_Win32Frame::XAP_Win32Frame(XAP_Win32App * app) - : XAP_Frame(static_cast(app)), - m_dialogFactory(this, static_cast(app)) +: XAP_Frame(app), + m_dialogFactory(this, app), + m_iBarHeight(0), + m_iStatusBarHeight(0) { m_pWin32App = app; m_pWin32Menu = NULL; @@ -231,7 +233,6 @@ UT_ASSERT(m_hwndRebar); // create a toolbar instance for each toolbar listed in our base class. - m_iBarHeight = 0; _createToolbars(); @@ -339,22 +340,38 @@ LRESULT CALLBACK XAP_Win32Frame::_FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { XAP_Win32Frame * f = GWL(hwnd); - AV_View * pView = NULL; - if (f) + if (!f) { - pView = f->m_pView; + return DefWindowProc(hwnd,iMsg,wParam,lParam); + } + + AV_View * pView = NULL; - if(iMsg == f->m_mouseWheelMessage) - { - wParam = MAKEWPARAM(0, (short)(int)wParam); - return SendMessage(hwnd, WM_MOUSEWHEEL, wParam, lParam); - } + pView = f->m_pView; + if(iMsg == f->m_mouseWheelMessage) + { + wParam = MAKEWPARAM(0, (short)(int)wParam); + return SendMessage(hwnd, WM_MOUSEWHEEL, wParam, lParam); } switch (iMsg) { + case WM_SETFOCUS: + if (pView) + { + pView->focusChange(AV_FOCUS_HERE); + } + return 0; + + case WM_KILLFOCUS: + if (pView) + { + pView->focusChange(AV_FOCUS_NONE); + } + return 0; + case WM_CREATE: return 0; diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/xp/xav_View.cpp abi-focus/src/af/xap/xp/xav_View.cpp --- abi/src/af/xap/xp/xav_View.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/xp/xav_View.cpp Wed May 10 16:24:38 2000 @@ -21,6 +21,7 @@ #include "ut_types.h" #include "xav_View.h" #include "xav_Listener.h" +#include"ut_debugmsg.h" AV_View::AV_View(XAP_App * pApp, void* pParentData) { @@ -31,12 +32,13 @@ m_yScrollOffset = 0; m_iWindowHeight = 0; m_iWindowWidth = 0; + m_focus=AV_FOCUS_NONE; } AV_View::~AV_View() { } - + void* AV_View::getParentData() const { return m_pParentData; diff -Naur --exclude=CVS --exclude=Linux* abi/src/af/xap/xp/xav_View.h abi-focus/src/af/xap/xp/xav_View.h --- abi/src/af/xap/xp/xav_View.h Wed May 10 15:50:16 2000 +++ abi-focus/src/af/xap/xp/xav_View.h Wed May 10 16:24:38 2000 @@ -30,6 +30,13 @@ // TODO shouldn't these classes be xav_ prefixed ?? +enum AV_Focus +{ + AV_FOCUS_HERE, + AV_FOCUS_NEARBY, + AV_FOCUS_NONE +}; + typedef enum _AV_ScrollCmd { AV_SCROLLCMD_PAGEUP, @@ -64,6 +71,10 @@ AV_View(XAP_App * pApp, void*); virtual ~AV_View(); + virtual void focusChange(AV_Focus focus)=0; + AV_Focus getFocus(){ return m_focus; } + void setFocus(AV_Focus focus){ m_focus=focus; } + void* getParentData() const; void setInsertMode(UT_Bool bInsert); @@ -107,6 +118,7 @@ UT_sint32 m_yScrollOffset; UT_sint32 m_iWindowHeight; UT_sint32 m_iWindowWidth; + AV_Focus m_focus; UT_Bool m_bInsertMode; diff -Naur --exclude=CVS --exclude=Linux* abi/src/text/fmt/xp/fp_Run.cpp abi-focus/src/text/fmt/xp/fp_Run.cpp --- abi/src/text/fmt/xp/fp_Run.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/text/fmt/xp/fp_Run.cpp Wed May 10 16:24:38 2000 @@ -394,6 +394,7 @@ UT_uint32 iRunBase = m_pBL->getPosition() + m_iOffsetFirst; if ( + pView->getFocus()!=AV_FOCUS_NONE && (iSel1 <= iRunBase) && (iSel2 > iRunBase) ) @@ -631,6 +632,7 @@ UT_ASSERT(iSel1 <= iSel2); if ( + pView->getFocus()!=AV_FOCUS_NONE && (iSel1 <= iRunBase) && (iSel2 > iRunBase) ) @@ -946,6 +948,7 @@ UT_ASSERT(iSel1 <= iSel2); if ( + pView->getFocus()!=AV_FOCUS_NONE && (iSel1 <= iRunBase) && (iSel2 > iRunBase) ) diff -Naur --exclude=CVS --exclude=Linux* abi/src/text/fmt/xp/fp_TextRun.cpp abi-focus/src/text/fmt/xp/fp_TextRun.cpp --- abi/src/text/fmt/xp/fp_TextRun.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/text/fmt/xp/fp_TextRun.cpp Wed May 10 16:24:38 2000 @@ -757,7 +757,7 @@ UT_ASSERT(iSel1 <= iSel2); - if (iSel1 == iSel2) + if (pView->getFocus()==AV_FOCUS_NONE || iSel1 == iSel2) { // nothing in this run is selected _drawPart(pDA->xoff, yTopOfRun, m_iOffsetFirst, m_iLen, pgbCharWidths); diff -Naur --exclude=CVS --exclude=Linux* abi/src/text/fmt/xp/fv_View.cpp abi-focus/src/text/fmt/xp/fv_View.cpp --- abi/src/text/fmt/xp/fv_View.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/text/fmt/xp/fv_View.cpp Wed May 10 16:24:38 2000 @@ -136,6 +136,65 @@ FREEP(m_chg.propsBlock); FREEP(m_chg.propsSection); } + +void FV_View::focusChange(AV_Focus focus) +{ + m_focus=focus; + switch(focus) + { + case AV_FOCUS_HERE: + if (isSelectionEmpty()) + { + _fixInsertionPointCoords(); + _drawInsertionPoint(); + } + else + { + _drawSelection(); + } + break; + case AV_FOCUS_NEARBY: + if (isSelectionEmpty()) + { + _fixInsertionPointCoords(); + _drawInsertionPoint(); + } + else + { + _drawSelection(); + } + break; + case AV_FOCUS_NONE: + if (isSelectionEmpty()) + { + _eraseInsertionPoint(); + } + else + { + if (!m_bSelection) + { + _resetSelection(); + break; + } + + UT_uint32 iPos1, iPos2; + + if (m_iSelectionAnchor < getPoint()) + { + iPos1 = m_iSelectionAnchor; + iPos2 = getPoint(); + } + else + { + iPos1 = getPoint(); + iPos2 = m_iSelectionAnchor; + } + + _clearBetweenPositions(iPos1, iPos2, UT_TRUE); + _drawBetweenPositions(iPos1, iPos2); + } + } +} FL_DocLayout* FV_View::getLayout() const { @@ -474,7 +533,7 @@ } _clearBetweenPositions(iPos1, iPos2, UT_TRUE); - + _resetSelection(); _drawBetweenPositions(iPos1, iPos2); @@ -3643,7 +3702,9 @@ void FV_View::_drawInsertionPoint() { - if (m_bCursorBlink) + if(m_focus==AV_FOCUS_NONE) + return; + if (m_bCursorBlink && m_focus==AV_FOCUS_HERE) { if (m_pAutoCursorTimer == NULL) { m_pAutoCursorTimer = UT_Timer::static_constructor(_autoDrawPoint, this, m_pG); diff -Naur --exclude=CVS --exclude=Linux* abi/src/text/fmt/xp/fv_View.h abi-focus/src/text/fmt/xp/fv_View.h --- abi/src/text/fmt/xp/fv_View.h Wed May 10 15:50:16 2000 +++ abi-focus/src/text/fmt/xp/fv_View.h Wed May 10 16:24:38 2000 @@ -106,6 +106,8 @@ inline UT_uint32 getPoint(void) const { return m_iInsPoint; } inline UT_uint32 getSelectionAnchor(void) const { return m_bSelection? m_iSelectionAnchor : m_iInsPoint; } + virtual void focusChange(AV_Focus focus); + virtual void setXScrollOffset(UT_sint32); virtual void setYScrollOffset(UT_sint32); virtual void cmdScroll(AV_ScrollCmd cmd, UT_uint32 iPos = 0); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Break.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Break.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Break.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Break.cpp Wed May 10 16:24:38 2000 @@ -95,6 +95,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Field.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Field.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Field.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Field.cpp Wed May 10 16:24:38 2000 @@ -108,6 +108,8 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); + // Populate the window's data items _populateCatogries(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Goto.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Goto.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Goto.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Goto.cpp Wed May 10 16:24:38 2000 @@ -109,6 +109,7 @@ // create a top level window, the actual dialog topLevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); + connectFocus(GTK_WIDGET(topLevel),pFrame); gtk_signal_connect_after(GTK_OBJECT(topLevel), "destroy", NULL, diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Insert_DateTime.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Insert_DateTime.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Insert_DateTime.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Insert_DateTime.cpp Wed May 10 16:24:38 2000 @@ -96,6 +96,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Options.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Options.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Options.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Options.cpp Wed May 10 16:24:38 2000 @@ -96,6 +96,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // save for use with event m_pFrame = pFrame; diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Paragraph.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Paragraph.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Paragraph.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Paragraph.cpp Wed May 10 16:24:38 2000 @@ -136,6 +136,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Replace.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Replace.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Replace.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Replace.cpp Wed May 10 16:24:38 2000 @@ -136,6 +136,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Spell.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Spell.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Spell.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Spell.cpp Wed May 10 16:24:38 2000 @@ -68,6 +68,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // Populate the window's data items _populateWindowData(); diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixDialog_Tab.cpp abi-focus/src/wp/ap/unix/ap_UnixDialog_Tab.cpp --- abi/src/wp/ap/unix/ap_UnixDialog_Tab.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixDialog_Tab.cpp Wed May 10 16:24:38 2000 @@ -77,6 +77,7 @@ GtkWidget * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); + connectFocus(GTK_WIDGET(mainWindow),pFrame); // save for use with event m_pFrame = pFrame; diff -Naur --exclude=CVS --exclude=Linux* abi/src/wp/ap/unix/ap_UnixFrame.cpp abi-focus/src/wp/ap/unix/ap_UnixFrame.cpp --- abi/src/wp/ap/unix/ap_UnixFrame.cpp Wed May 10 15:50:16 2000 +++ abi-focus/src/wp/ap/unix/ap_UnixFrame.cpp Wed May 10 16:24:38 2000 @@ -44,6 +44,7 @@ #include "xap_UnixFontManager.h" #include "ap_UnixStatusBar.h" #include "ap_UnixViewListener.h" +#include"ut_dialogHelper.h" #ifdef ABISOURCE_LICENSED_TRADEMARKS #include "abiword_48_tm.xpm" @@ -92,7 +93,7 @@ AV_ListenerId lidScrollbarViewListener; UT_uint32 nrToolbars; UT_uint32 point = 0; - + gboolean bFocus; XAP_UnixFontManager * fontManager = ((XAP_UnixApp *) getApp())->getFontManager(); pG = new GR_UnixGraphics(m_dArea->window, fontManager); @@ -110,7 +111,8 @@ point = ((FV_View *) m_pView)->getPoint(); } ENSUREP(pView); - + bFocus=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(m_wTopLevelWindow),"toplevelWindowFocus")); + pView->setFocus(bFocus && (gtk_grab_get_current()==NULL || gtk_grab_get_current()==m_wTopLevelWindow) ? AV_FOCUS_HERE : !bFocus && gtk_grab_get_current()!=NULL && isTransientWindow(GTK_WINDOW(gtk_grab_get_current()),GTK_WINDOW(m_wTopLevelWindow)) ? AV_FOCUS_NEARBY : AV_FOCUS_NONE); // The "AV_ScrollObj pScrollObj" receives // send{Vertical,Horizontal}ScrollEvents // from both the scroll-related edit methods