X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXView.C;h=462e53d9ffa820028a8d7e24473b099c846d4f5f;hb=f9a45f76521c1c2cad9dd05868b6cfcc6c81cdbe;hp=44121b1f255f5e6b3efd129f9ede9bfa361ed0cb;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/LyXView.C b/src/LyXView.C index 44121b1f25..462e53d9ff 100644 --- a/src/LyXView.C +++ b/src/LyXView.C @@ -1,13 +1,13 @@ // -*- C++ -*- /* This file is part of - * ====================================================== + * ====================================================== * * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich * Copyright 1995-1999 The LyX Team. * - * ======================================================*/ + * ====================================================== */ #include @@ -15,6 +15,9 @@ #pragma implementation #endif +#include +#include + #include "LyXView.h" #include "lyx_main.h" #include "lyxlookup.h" @@ -22,36 +25,31 @@ #include "minibuffer.h" #include "lyxfunc.h" #include "lyx.xpm" -#include "error.h" +#include "debug.h" #include "layout_forms.h" #include "intl.h" #include "lyxrc.h" -#include "lyxscreen.h" #include "support/filetools.h" // OnlyFilename() #include "layout.h" #include "lyxtext.h" -extern FD_form_document *fd_form_document; -FD_form_main *fd_form_main; /* a pointer to the one in LyXView - should be removed as soon as possible */ - -MiniBuffer *minibuffer;/* a pointer to the one in LyXView - should be removed as soon as possible */ +extern FD_form_document * fd_form_document; extern void AutoSave(); extern char updatetimer; extern void QuitLyX(); -int current_layout = 0; +LyXTextClass::size_type current_layout = 0; // This is very temporary -BufferView *current_view; +BufferView * current_view; +extern "C" int C_LyXView_atCloseMainFormCB(FL_FORM *, void *); LyXView::LyXView(int width, int height) { - fd_form_main = create_form_form_main(width,height); - fl_set_form_atclose(_form, atCloseMainFormCB, 0); - lyxerr.debug("Initializing LyXFunc"); + create_form_form_main(width, height); + fl_set_form_atclose(_form, C_LyXView_atCloseMainFormCB, 0); + lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl; lyxfunc = new LyXFunc(this); intl = new Intl; } @@ -67,39 +65,55 @@ LyXView::~LyXView() delete intl; } + /// Redraw the main form. void LyXView::redraw() { - lyxerr.debug("LyXView::redraw()"); + lyxerr[Debug::INFO] << "LyXView::redraw()" << endl; fl_redraw_form(_form); minibuffer->Activate(); } // Callback for update timer -void LyXView::UpdateTimerCB(FL_OBJECT *ob, long) +void LyXView::UpdateTimerCB(FL_OBJECT * ob, long) { - LyXView *view = (LyXView*) ob->u_vdata; - if (!view->currentView()->available()) + LyXView * view = static_cast(ob->u_vdata); + if (!view->view()->available()) return; - if (!view->currentView()->getScreen() || !updatetimer) + if (!updatetimer) return; - view->currentView()->getScreen()->HideCursor(); - view->currentBuffer()->update(-2); + view->view()->hideCursor(); + view->view()->update(-2); + /* This update can happen, even when the work area has lost * the focus. So suppress the cursor in that case */ updatetimer = 0; } +// Wrapper for the above +extern "C" void C_LyXView_UpdateTimerCB(FL_OBJECT * ob, long data) +{ + LyXView::UpdateTimerCB(ob, data); +} + + // Callback for autosave timer void LyXView::AutosaveTimerCB(FL_OBJECT *, long) { - lyxerr.debug("Running AutoSave()"); + lyxerr[Debug::INFO] << "Running AutoSave()" << endl; AutoSave(); } +// Wrapper for the above +extern "C" void C_LyXView_AutosaveTimerCB(FL_OBJECT * ob, long data) +{ + LyXView::AutosaveTimerCB(ob, data); +} + + /// Reset autosave timer void LyXView::resetAutosaveTimer() { @@ -116,13 +130,20 @@ int LyXView::atCloseMainFormCB(FL_FORM *, void *) } +// Wrapper for the above +extern "C" int C_LyXView_atCloseMainFormCB(FL_FORM * form, void * p) +{ + return LyXView::atCloseMainFormCB(form, p); +} + + void LyXView::setPosition(int x, int y) { fl_set_form_position(_form, x, y); } -void LyXView::show(int place, int border, char const* title) +void LyXView::show(int place, int border, char const * title) { fl_show_form(_form, place, border, title); minibuffer->Init(); @@ -130,7 +151,7 @@ void LyXView::show(int place, int border, char const* title) } -FD_form_main *LyXView::create_form_form_main(int width, int height) +void LyXView::create_form_form_main(int width, int height) /* to make this work as it should, .lyxrc should have been * read first; OR maybe this one should be made dynamic. * Hmmmm. Lgb. @@ -139,22 +160,20 @@ FD_form_main *LyXView::create_form_form_main(int width, int height) * are presented (and rightly so) in GUI popups. Asger. */ { - FL_OBJECT *obj; - - FD_form_main *fdui = (FD_form_main *) - fl_calloc(1, sizeof(FD_form_main)); + FD_form_main * fdui = static_cast + (fl_calloc(1, sizeof(FD_form_main))); _form_main = fdui; // the main form _form = fdui->form_main = fl_bgn_form(FL_NO_BOX, width, height); - fdui->form_main->u_vdata = (void*) this; - obj = fl_add_box(FL_FLAT_BOX,0,0,width,height,""); - fl_set_object_color(obj,FL_MCOL,FL_MCOL); + fdui->form_main->u_vdata = this; + FL_OBJECT * obj = fl_add_box(FL_FLAT_BOX, 0, 0, width, height, ""); + fl_set_object_color(obj, FL_MCOL, FL_MCOL); // Parameters for the appearance of the main form - const int air = 2; - const int bw = abs(fl_get_border_width()); + int const air = 2; + int const bw = abs(fl_get_border_width()); // // THE MENUBAR @@ -175,21 +194,19 @@ FD_form_main *LyXView::create_form_form_main(int width, int height) // WORKAREA // - const int ywork = 60 + 2*air + bw; - const int workheight = height - ywork - (25 + 2*air); + int const ywork = 60 + 2 * air + bw; + int const workheight = height - ywork - (25 + 2 * air); ::current_view = bufferview = new BufferView(this, air, ywork, - width - 3*air, + width - 3 * air, workheight); // // MINIBUFFER // - minibuffer = new MiniBuffer(this, air, height-(25+air), - width-(2*air), 25); - ::minibuffer = minibuffer; // to be removed later - + minibuffer = new MiniBuffer(this, air, height - (25 + air), + width - (2 * air), 25); // // TIMERS @@ -197,14 +214,14 @@ FD_form_main *LyXView::create_form_form_main(int width, int height) // timer_autosave fdui->timer_autosave = obj = fl_add_timer(FL_HIDDEN_TIMER, - 0,0,0,0,"Timer"); - fl_set_object_callback(obj,AutosaveTimerCB,0); + 0, 0, 0, 0, "Timer"); + fl_set_object_callback(obj, C_LyXView_AutosaveTimerCB, 0); // timer_update fdui->timer_update = obj = fl_add_timer(FL_HIDDEN_TIMER, - 0,0,0,0,"Timer"); - fl_set_object_callback(obj,UpdateTimerCB,0); - obj->u_vdata = (void*) this; + 0, 0, 0, 0, "Timer"); + fl_set_object_callback(obj, C_LyXView_UpdateTimerCB, 0); + obj->u_vdata = this; // // Misc @@ -214,7 +231,7 @@ FD_form_main *LyXView::create_form_form_main(int width, int height) unsigned int w, h; Pixmap lyx_p, lyx_mask; lyx_p = fl_create_from_pixmapdata(fl_root, - lyx_xpm, + const_cast(lyx_xpm), &w, &h, &lyx_mask, @@ -227,11 +244,11 @@ FD_form_main *LyXView::create_form_form_main(int width, int height) fl_set_form_minsize(fdui->form_main, 50, 50); fl_end_form(); - - return fdui; } +extern "C" int C_LyXView_KeyPressMask_raw_callback(FL_FORM * fl, void * xev); + void LyXView::init() { // Set the textclass choice @@ -247,7 +264,7 @@ void LyXView::init() // Install the raw callback for keyboard events fl_register_raw_callback(_form, KeyPressMask, - KeyPressMask_raw_callback); + C_LyXView_KeyPressMask_raw_callback); intl->InitKeyMapper(lyxrc->use_kbmap); } @@ -260,12 +277,12 @@ void LyXView::invalidateLayoutChoice() void LyXView::updateLayoutChoice() { - /* update the layout display */ + // Update the layout display if (!toolbar->combox) return; - // this has a bi-effect that the layouts are not showed when no + // This has a side-effect that the layouts are not showed when no // document is loaded. - if (bufferview==0 || bufferview->currentBuffer()==0) { + if (bufferview == 0 || bufferview->buffer() == 0) { toolbar->combox->clear(); toolbar->combox->Redraw(); return; @@ -273,26 +290,23 @@ void LyXView::updateLayoutChoice() // If textclass is different, we need to update the list if (toolbar->combox->empty() || - (last_textclass != currentBuffer()->params.textclass)) { + (last_textclass != int(buffer()->params.textclass))) { toolbar->combox->clear(); - for (int i = 0; - lyxstyle.NameOfLayout(currentBuffer()-> - params.textclass, i) !="@@end@@"; - i++) { - LyXLayout *layout = lyxstyle. - Style(currentBuffer()->params.textclass, i); - if (layout->obsoleted_by.empty()) - toolbar->combox->addline(layout->name.c_str()); + LyXTextClass const & tc = textclasslist.TextClass(buffer()->params.textclass); + for (LyXTextClass::const_iterator cit = tc.begin(); + cit != tc.end(); ++cit) { + if ((*cit).obsoleted_by().empty()) + toolbar->combox->addline((*cit).name().c_str()); else - toolbar->combox->addline(("@N"+layout->name).c_str()); + toolbar->combox->addline(("@N" + (*cit).name()).c_str()); } - last_textclass = currentBuffer()->params.textclass; + last_textclass = int(buffer()->params.textclass); current_layout = 0; } // we need to do this. toolbar->combox->Redraw(); - - char layout = currentBuffer()->text->cursor.par->GetLayout(); + + LyXTextClass::size_type layout = bufferview->text->cursor.par->GetLayout(); if (layout != current_layout){ toolbar->combox->select(layout + 1); @@ -303,13 +317,13 @@ void LyXView::updateLayoutChoice() void LyXView::UpdateDocumentClassChoice() { - /* update the document class display in the document form */ - int i; + // Update the document class display in the document form if (fd_form_document) { fl_clear_choice(fd_form_document->choice_class); - for (i = 0; lyxstyle.DescOfClass (i)!="@@end@@"; i++) { + for (LyXTextClassList::const_iterator cit = textclasslist.begin(); + cit != textclasslist.end(); ++cit) { fl_addto_choice(fd_form_document->choice_class, - lyxstyle.DescOfClass(i).c_str()); + (*cit).description().c_str()); } } } @@ -317,35 +331,79 @@ void LyXView::UpdateDocumentClassChoice() // This is necessary, since FL_FREE-Objects doesn't get all keypress events // as FL_KEYBOARD events :-( Matthias 280596 -int LyXView::KeyPressMask_raw_callback(FL_FORM *fl, void *xev) +int LyXView::KeyPressMask_raw_callback(FL_FORM * fl, void * xev) { - LyXView *view = (LyXView*) fl->u_vdata; + LyXView * view = static_cast(fl->u_vdata); int retval = 0; // 0 means XForms should have a look at this event + XKeyEvent * xke = static_cast(xev); + static Time last_time_pressed = 0; + static Time last_time_released = 0; + static unsigned int last_key_pressed = 0; + static unsigned int last_key_released = 0; + static unsigned int last_state_pressed = 0; + static unsigned int last_state_released = 0; + // funny. Even though the raw_callback is registered with KeyPressMask, // also KeyRelease-events are passed through:-( - // [It seems that xforms puts them in pairs... (JMarc)] - if (((XEvent*)xev)->type == KeyPress - && view->bufferview->getWorkArea()->focus - && view->bufferview->getWorkArea()->active) - retval = view->getLyXFunc()->processKeyEvent((XEvent*)xev); + // [It seems that XForms puts them in pairs... (JMarc)] + if (static_cast(xev)->type == KeyPress + && view->bufferview->focus() + && view->bufferview->active()) + { + last_time_pressed = xke->time; + last_key_pressed = xke->keycode; + last_state_pressed = xke->state; + retval = view->getLyXFunc() + ->processKeyEvent(static_cast(xev)); + } + else if (static_cast(xev)->type == KeyRelease + && view->bufferview->focus() + && view->bufferview->active()) +{ + last_time_released = xke->time; + last_key_released = xke->keycode; + last_state_released = xke->state; + } + if (last_key_released == last_key_pressed + && last_state_released == last_state_pressed + && last_time_released == last_time_pressed) { + // When the diff between last_time_released and + // last_time_pressed is 0, that sinifies an autoreapeat + // at least on my system. It like some feedback from + // others, especially from user running LyX remote. + //lyxerr << "Syncing - purging X events." << endl; + XSync(fl_get_display(), 1); + // This purge make f.ex. scrolling stop imidiatly when + // releaseing the PageDown button. The question is if this + // purging of XEvents can cause any harm...after some testing + // I can see no problems, but I'd like other reports too. + } return retval; } +// wrapper for the above +extern "C" int C_LyXView_KeyPressMask_raw_callback(FL_FORM * fl, void * xev) +{ + return LyXView::KeyPressMask_raw_callback(fl, xev); +} + + // Updates the title of the window with the filename of the current document -void LyXView::updateWindowTitle() { - static string last_title="LyX"; +void LyXView::updateWindowTitle() +{ + static string last_title = "LyX"; string title = "LyX"; - if (currentView()->available()) { - string cur_title = currentBuffer()->getFileName(); + if (view()->available()) { + string cur_title = buffer()->fileName(); if (!cur_title.empty()){ title += ": " + OnlyFilename(cur_title); - if (!currentBuffer()->isLyxClean()) + if (!buffer()->isLyxClean()) title += _(" (Changed)"); - if (currentBuffer()->isReadonly()) + if (buffer()->isReadonly()) title += _(" (read only)"); } }