- last_click_x = -1;
- last_click_y = -1;
-
- if (_buffer == 0) return 0;
- if (!screen) return 0;
-
- int const x = ev->xbutton.x - ob->x;
- int const y = ev->xbutton.y - ob->y;
- // If we hit an inset, we have the inset coordinates in these
- // and inset_hit points to the inset. If we do not hit an
- // inset, inset_hit is 0, and inset_x == x, inset_y == y.
- int inset_x = x;
- int inset_y = y;
- Inset * inset_hit = checkInsetHit(inset_x, inset_y);
-
- // ok ok, this is a hack.
- int button = ev->xbutton.button;
- if (button == 4 || button == 5) goto wheel;
-
- {
-
- if (_buffer->the_locking_inset) {
- // We are in inset locking mode
-
- /* Check whether the inset was hit. If not reset mode,
- otherwise give the event to the inset */
- if (inset_hit != 0) {
- _buffer->the_locking_inset->
- InsetButtonPress(inset_x, inset_y, button);
- return 0;
- } else {
- UnlockInset(_buffer->the_locking_inset);
- }
- }
-
- selection_possible = true;
- screen->HideCursor();
-
- // Right button mouse click on a table
- if (button == 3 &&
- (_buffer->text->cursor.par->table ||
- _buffer->text->MouseHitInTable(x, y+screen->first))) {
- // Set the cursor to the press-position
- _buffer->text->SetCursorFromCoordinates(x, y + screen->first);
- bool doit = true;
-
- // Only show the table popup if the hit is in the table, too
- if (!_buffer->text->HitInTable(_buffer->text->cursor.row, x))
- doit = false;
-
- // Hit above or below the table?
- if (doit) {
- long y_tmp = y + screen->first;
- Row* row = _buffer->text->GetRowNearY(y_tmp);
-#if 0
- // Isn't this empty code anyway? (Lgb)
- if (row->par != _buffer->text->cursor.par)
- doit = true;
- }
-
- if (doit) {
-#endif
- if (!_buffer->text->selection) {
- screen->ToggleSelection();
- _buffer->text->ClearSelection();
- _buffer->text->FullRebreak();
- screen->Update();
- updateScrollbar();
- }
- // Popup table popup when on a table.
- // This is obviously temporary, since we should be
- // able to
- // popup various context-sensitive-menus with the
- // the right mouse. So this should be done more
- // general in the future. Matthias.
- selection_possible = false;
- _owner->getLyXFunc()->Dispatch(LFUN_LAYOUT_TABLE,
- "true");
- return 0;
- }
- }
-
- int screen_first = screen->first;
-
- // Middle button press pastes if we have a selection
- bool paste_internally = false;
- if (button == 2 // && !_buffer->the_locking_inset
- && _buffer->text->selection) {
- _owner->getLyXFunc()->Dispatch(LFUN_COPY);
- paste_internally = true;
- }
-
- // Clear the selection
- screen->ToggleSelection();
- _buffer->text->ClearSelection();
- _buffer->text->FullRebreak();
- screen->Update();
- updateScrollbar();
-
- // Single left click in math inset?
- if (inset_hit != 0 && inset_hit->Editable() == 2) {
- // Highly editable inset, like math
- selection_possible = false;
- _owner->updateLayoutChoice();
- _owner->getMiniBuffer()->Set(inset_hit->EditMessage());
- inset_hit->Edit(inset_x, inset_y);
- return 0;
- }
-
- // Right click on a footnote flag opens float menu
- if (button == 3) {
-#if 0
- // Isn't this empty code anyway? (Lgb)
- if (_buffer->text->cursor.par->footnoteflag ==
- LyXParagraph::OPEN_FOOTNOTE) {
- selection_possible = false;
- lyxerr.debug("LyX: Sorry not implemented yet.");
- return 0;
- }
- }
-
- if (button == 3) {
-#endif
- selection_possible = false;
- return 0;
- }
-
- _buffer->text->SetCursorFromCoordinates(x, y + screen_first);
- _buffer->text->FinishUndo();
- _buffer->text->sel_cursor = _buffer->text->cursor;
- _buffer->text->cursor.x_fix = _buffer->text->cursor.x;
-
- _owner->updateLayoutChoice();
- if (screen->FitCursor()){
- updateScrollbar();
- selection_possible = false;
- }
-
- // Insert primary selection with middle mouse
- // if there is a local selection in the current buffer, insert this
- if (button == 2) { // && !_buffer->the_locking_inset){
- if (paste_internally)
- _owner->getLyXFunc()->Dispatch(LFUN_PASTE);
- else
- _owner->getLyXFunc()->Dispatch(LFUN_PASTESELECTION,
- "paragraph");
- selection_possible = false;
- return 0;
- }
- }
- goto out;
- wheel: {
- // I am not quite sure if this is the correct place to put this,
- // but it will not cause any harm.
- // Patch from Mark Huang (markman@mit.edu) to make LyX recognise
- // button 4 and 5. This enables LyX use use the scrollwhell on
- // certain mice for something useful. (Lgb)
- // Added wheel acceleration detection code. (Rvdk)
- static Time lastTime = 0;
- int diff = ev->xbutton.time - lastTime;
- int scroll = int(1.0 + (4.0/(abs(diff)+1.0))*200.0);
- switch (button) {
- case 4:
- ScrollUp(scroll);
- break;
- case 5:
- ScrollDown(scroll);
- break;
- }
- lastTime = ev->xbutton.time;
- return 0;
- }
- out:
- last_click_x = x;
- last_click_y = y;
-
- return 0;