X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXView.C;h=462e53d9ffa820028a8d7e24473b099c846d4f5f;hb=f9a45f76521c1c2cad9dd05868b6cfcc6c81cdbe;hp=5e2b9ba3e123e8888473fb7be821a16c0ae45cbe;hpb=dfe1bc44b44903faf77ef454c98c4c3e56c1d5e3;p=lyx.git diff --git a/src/LyXView.C b/src/LyXView.C index 5e2b9ba3e1..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" @@ -26,33 +29,27 @@ #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); + create_form_form_main(width, height); fl_set_form_atclose(_form, C_LyXView_atCloseMainFormCB, 0); - lyxerr.debug() << "Initializing LyXFunc" << endl; + lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl; lyxfunc = new LyXFunc(this); intl = new Intl; } @@ -68,46 +65,51 @@ LyXView::~LyXView() delete intl; } + /// Redraw the main form. void LyXView::redraw() { - lyxerr.debug() << "LyXView::redraw()" << endl; + 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); +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()" << endl; + lyxerr[Debug::INFO] << "Running AutoSave()" << endl; AutoSave(); } + // Wrapper for the above -extern "C" void C_LyXView_AutosaveTimerCB(FL_OBJECT *ob, long data) { +extern "C" void C_LyXView_AutosaveTimerCB(FL_OBJECT * ob, long data) +{ LyXView::AutosaveTimerCB(ob, data); } @@ -127,9 +129,11 @@ int LyXView::atCloseMainFormCB(FL_FORM *, void *) return FL_IGNORE; } + // Wrapper for the above -extern "C" int C_LyXView_atCloseMainFormCB(FL_FORM *form, void *p) { - return LyXView::atCloseMainFormCB(form,p); +extern "C" int C_LyXView_atCloseMainFormCB(FL_FORM * form, void * p) +{ + return LyXView::atCloseMainFormCB(form, p); } @@ -139,7 +143,7 @@ void LyXView::setPosition(int x, int 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(); @@ -147,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. @@ -156,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 @@ -192,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 @@ -214,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,C_LyXView_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,C_LyXView_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 @@ -231,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, @@ -244,11 +244,10 @@ 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); + +extern "C" int C_LyXView_KeyPressMask_raw_callback(FL_FORM * fl, void * xev); void LyXView::init() { @@ -278,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; @@ -291,26 +290,23 @@ void LyXView::updateLayoutChoice() // If textclass is different, we need to update the list if (toolbar->combox->empty() || - (last_textclass != int(currentBuffer()->params.textclass))) { + (last_textclass != int(buffer()->params.textclass))) { toolbar->combox->clear(); - for (int i = 0; - textclasslist.NameOfLayout(currentBuffer()-> - params.textclass, i) !="@@end@@"; - i++) { - LyXLayout const & layout = textclasslist. - 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 = int(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); @@ -321,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; textclasslist.DescOfClass (i)!="@@end@@"; i++) { + for (LyXTextClassList::const_iterator cit = textclasslist.begin(); + cit != textclasslist.end(); ++cit) { fl_addto_choice(fd_form_document->choice_class, - textclasslist.DescOfClass(i).c_str()); + (*cit).description().c_str()); } } } @@ -335,40 +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) +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)"); } }