diff --git a/ChangeLog b/ChangeLog index ef0d37aa..29bfca13 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2016-10-14 Markus Gans + * Virtual windows can now store their own offset information + * Correct implementation of the move() method + 2016-10-13 Markus Gans * Reduces in the code the number of friend classes diff --git a/src/fapp.h b/src/fapp.h index 10ca1d8c..8f65a6f2 100644 --- a/src/fapp.h +++ b/src/fapp.h @@ -71,7 +71,7 @@ class FApplication : public FWidget char x11_mouse[4]; char sgr_mouse[13]; char urxvt_mouse[13]; - + #ifdef F_HAVE_LIBGPM diff --git a/src/fdialog.cpp b/src/fdialog.cpp index 9f0825a6..0b0e09aa 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -107,7 +107,7 @@ void FDialog::init() accelerator_list = new Accelerators(); // Add the dialog menu dialog_menu = new FMenu ("-", this); - dialog_menu->move (getX(), getY()+1); + dialog_menu->setPos (getX(), getY()+1); dgl_menuitem = dialog_menu->getItem(); if ( dgl_menuitem ) @@ -154,7 +154,8 @@ void FDialog::drawBorder() int y1 = 2; int y2 = 1 + getHeight() - 1; - if ( (getMoveSizeWidget() || ! resize_click_pos.isNull()) && ! isZoomed() ) + if ( (getMoveSizeWidget() == this || ! resize_click_pos.isNull()) + && ! isZoomed() ) setColor (wc.dialog_resize_fg, getBackgroundColor()); else setColor(); @@ -392,7 +393,7 @@ void FDialog::openMenu() else { setOpenMenu(dialog_menu); - dialog_menu->move (getX(), getY()+1); + dialog_menu->setPos (getX(), getY()+1); dialog_menu->setVisible(); drawTitleBar(); dialog_menu->show(); @@ -445,6 +446,7 @@ void FDialog::cb_move (FWidget*, void*) return; setMoveSizeWidget(this); + drawBorder(); save_geometry = getGeometry(); tooltip = new FToolTip(this); @@ -620,22 +622,22 @@ void FDialog::onKeyPress (FKeyEvent* ev) switch ( ev->key() ) { case fc::Fkey_up: - move (getX(), getY() - 1); + move (0, -1); ev->accept(); break; case fc::Fkey_down: - move (getX(), getY() + 1); + move (0, 1); ev->accept(); break; case fc::Fkey_left: - move (getX() - 1, getY()); + move (-1, 0); ev->accept(); break; case fc::Fkey_right: - move (getX() + 1, getY()); + move (1, 0); ev->accept(); break; @@ -695,7 +697,7 @@ void FDialog::onKeyPress (FKeyEvent* ev) delete tooltip; tooltip = 0; - move (save_geometry.getPos()); + setPos (save_geometry.getPos()); if ( isResizeable() ) setSize (save_geometry.getWidth(), save_geometry.getHeight()); @@ -859,9 +861,8 @@ void FDialog::onMouseUp (FMouseEvent* ev) && titlebar_x < getTermX() + getWidth() && titlebar_y == getTermY() ) { - FPoint currentPos(getGeometry().getX(), getGeometry().getY()); FPoint deltaPos = ev->getTermPos() - titlebar_click_pos; - move (currentPos + deltaPos); + move (deltaPos); titlebar_click_pos = ev->getTermPos(); } @@ -953,9 +954,8 @@ void FDialog::onMouseMove (FMouseEvent* ev) if ( ! titlebar_click_pos.isNull() ) { - FPoint currentPos(getGeometry().getX(), getGeometry().getY()); FPoint deltaPos = ev->getTermPos() - titlebar_click_pos; - move (currentPos + deltaPos); + move (deltaPos); titlebar_click_pos = ev->getTermPos(); } @@ -1218,13 +1218,7 @@ int FDialog::exec() } //---------------------------------------------------------------------- -void FDialog::move (const FPoint& pos) -{ - move ( pos.getX(), pos.getY() ); -} - -//---------------------------------------------------------------------- -void FDialog::move (int x, int y) +void FDialog::setPos (int x, int y, bool) { int dx, dy, old_x, old_y, rsw, bsh, width, height; FRect old_geometry; @@ -1252,8 +1246,7 @@ void FDialog::move (int x, int y) old_geometry = getTermGeometryWithShadow(); // move to the new position - FWidget::move(x,y); - setPos(x, y, false); + FWindow::setPos(x, y, false); putArea (getTermPos(), vwin); // restoring the non-covered terminal areas @@ -1311,7 +1304,7 @@ void FDialog::move (int x, int y) } } - FWidget::adjustSize(); + FWindow::adjustSize(); // set the cursor to the focus widget FWidget* focus_widget = FWidget::getFocusWidget(); @@ -1326,6 +1319,12 @@ void FDialog::move (int x, int y) updateTerminal(); } +//---------------------------------------------------------------------- +void FDialog::move (int dx, int dy) +{ + setPos (getX() + dx, getY() + dy); +} + //---------------------------------------------------------------------- void FDialog::setSize (int w, int h, bool adjust) { diff --git a/src/fdialog.h b/src/fdialog.h index 64beee8a..4b16d025 100644 --- a/src/fdialog.h +++ b/src/fdialog.h @@ -127,8 +127,12 @@ class FDialog : public FWindow void show(); void hide(); int exec(); - void move (const FPoint&); + void setPos (int, int, bool = true); + // make every setPos from FWindow available + using FWindow::setPos; void move (int, int); + // make every move from FWindow available + using FWindow::move; void setSize (int, int, bool = true); bool setFocus (bool); diff --git a/src/fenum.h b/src/fenum.h index 6c752309..5c3ecb67 100644 --- a/src/fenum.h +++ b/src/fenum.h @@ -967,7 +967,7 @@ class fc CurlyBrackets = 3, // { } AngleBrackets = 4 // < > }; - + enum termcaps { t_bell, diff --git a/src/fmenu.cpp b/src/fmenu.cpp index 5584bf3d..0cbb4963 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -199,7 +199,7 @@ void FMenu::adjustItems() menu_Y = (*iter)->getTermY() - 2; // set sub-menu position - menu->move (menu_X, menu_Y); + menu->setPos (menu_X, menu_Y); // call sub-menu adjustItems() if ( menu->count() > 0 ) diff --git a/src/fmenu.h b/src/fmenu.h index 91335759..a802cd6b 100644 --- a/src/fmenu.h +++ b/src/fmenu.h @@ -12,7 +12,7 @@ // └─────┬─────┘ // │ // ▕▔▔▔▔▔▔▔▔▏ -// ▕ FVTerm ▏ +// ▕ FVTerm ▏ // ▕▁▁▁▁▁▁▁▁▏ *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏ // ▲ ┌ - -▕ FRadioMenuItem ▏ // │ : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏ diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index f9e86fc6..c0e65d6b 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -477,7 +477,7 @@ void FMenuBar::adjustItems() FMenu* menu = (*iter)->getMenu(); // set menu position - menu->move (menu->adjustX(item_X), item_Y); + menu->setPos (menu->adjustX(item_X), item_Y); // call menu adjustItems() menu->adjustItems(); diff --git a/src/fterm.cpp b/src/fterm.cpp index 10816529..1e178be0 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -2068,13 +2068,13 @@ void FTerm::finish() if ( mouse ) delete mouse; - + if ( term ) delete term; - + if ( opti_attr ) delete opti_attr; - + if ( opti_move ) delete opti_move; } @@ -2490,7 +2490,7 @@ char* FTerm::enableCursor() char* FTerm::disableCursor() { char*& vi = tcap[fc::t_cursor_invisible].string; - + if ( vi ) return vi; diff --git a/src/fterm.h b/src/fterm.h index 552f35ff..fb832c1e 100644 --- a/src/fterm.h +++ b/src/fterm.h @@ -39,7 +39,7 @@ #include // is deprecated, use instead #include #include -#include +#include #include #include diff --git a/src/ftermcap.h b/src/ftermcap.h index 731827fa..ebfefcb7 100644 --- a/src/ftermcap.h +++ b/src/ftermcap.h @@ -53,7 +53,7 @@ class FTermcap { return tcap; } - + void setTermcapMap (tcap_map* t) { tcap = t; diff --git a/src/fvterm.cpp b/src/fvterm.cpp index fb317da2..b3bbce04 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -42,7 +42,7 @@ FVTerm::FVTerm (FVTerm* parent) { terminal_update_complete = false; vterm_updates = true; - + if ( ! parent ) { init(); @@ -103,7 +103,7 @@ void FVTerm::init() tcap = FTermcap().getTermcapMap(); // create virtual terminal - FRect term_geometry (1, 1, getColumnNumber(), getLineNumber()); + FRect term_geometry (0, 0, getColumnNumber(), getLineNumber()); createVTerm (term_geometry); // create virtual desktop area @@ -168,7 +168,9 @@ void FVTerm::createArea ( const FRect& r , const FPoint& p , FVTerm::term_area*& area ) { - createArea ( r.getWidth() + createArea ( r.getX() + , r.getY() + , r.getWidth() , r.getHeight() , p.getX() , p.getY() @@ -176,26 +178,29 @@ void FVTerm::createArea ( const FRect& r } //---------------------------------------------------------------------- -void FVTerm::createArea ( int width, int height +void FVTerm::createArea ( int x_offset, int y_offset + , int width, int height , int rsw, int bsh , term_area*& area ) { // initialize virtual window area = new term_area; + area->x_offset = 0; + area->y_offset = 0; area->width = -1; area->height = -1; area->right_shadow = 0; area->bottom_shadow = 0; - area->input_cursor_x = -1;; - area->input_cursor_y = -1;; + area->input_cursor_x = -1; + area->input_cursor_y = -1; area->input_cursor_visible = false; area->changes = 0; area->text = 0; area->visible = false; area->widget = static_cast(this); - resizeArea (width, height, rsw, bsh, area); + resizeArea (x_offset, y_offset, width, height, rsw, bsh, area); } //---------------------------------------------------------------------- @@ -203,7 +208,9 @@ void FVTerm::resizeArea ( const FRect& r , const FPoint& p , FVTerm::term_area* area ) { - resizeArea ( r.getWidth() + resizeArea ( r.getX() + , r.getY() + , r.getWidth() , r.getHeight() , p.getX() , p.getY() @@ -211,7 +218,8 @@ void FVTerm::resizeArea ( const FRect& r } //---------------------------------------------------------------------- -void FVTerm::resizeArea ( int width, int height +void FVTerm::resizeArea ( int x_offset, int y_offset + , int width, int height , int rsw, int bsh , term_area* area ) { @@ -245,6 +253,8 @@ void FVTerm::resizeArea ( int width, int height else return; + area->x_offset = x_offset; + area->y_offset = y_offset; area->width = width; area->height = height; area->right_shadow = rsw; @@ -362,14 +372,17 @@ void FVTerm::restoreVTerm (int x, int y, int w, int h) while ( iter != end ) { term_area* win = (*iter)->getVWin(); - const FRect& geometry = (*iter)->getTermGeometryWithShadow(); + int win_x = win->x_offset; + int win_y = win->y_offset; + FRect geometry ( win_x + , win_y + , win->width + win->right_shadow + , win->height + win->bottom_shadow ); // window visible and contains current character - if ( win && win->visible && geometry.contains(tx+x+1, ty+y+1) ) + if ( win && win->visible && geometry.contains(tx+x, ty+y) ) { FOptiAttr::char_data* tmp; - int win_x = (*iter)->getTermX() - 1; - int win_y = (*iter)->getTermY() - 1; int line_len = win->width + win->right_shadow; tmp = &win->text[(ty+y-win_y) * line_len + (tx+x-win_x)]; @@ -440,8 +453,6 @@ FVTerm::covered_state FVTerm::isCovered ( int x, int y is_covered = non_covered; found = bool(area == vdesktop); - x++; - y++; w = static_cast(area->widget); @@ -454,18 +465,20 @@ FVTerm::covered_state FVTerm::isCovered ( int x, int y while ( iter != end ) { term_area* win = (*iter)->getVWin(); - const FRect& geometry = (*iter)->getTermGeometryWithShadow(); + int win_x = win->x_offset; + int win_y = win->y_offset; + FRect geometry ( win_x + , win_y + , win->width + win->right_shadow + , win->height + win->bottom_shadow ); if ( win && found - && (*iter)->isVisible() - && (*iter)->isShown() + && win->visible && geometry.contains(x,y) ) { FOptiAttr::char_data* tmp; - int win_x = (*iter)->getTermX() - 1; - int win_y = (*iter)->getTermY() - 1; int line_len = win->width + win->right_shadow; - tmp = &win->text[(y-win_y-1) * line_len + (x-win_x-1)]; + tmp = &win->text[(y-win_y) * line_len + (x-win_x)]; if ( tmp->trans_shadow ) { @@ -517,8 +530,8 @@ void FVTerm::updateVTerm (FVTerm::term_area* area) if ( ! area->visible ) return; - ax = area->widget->getTermX() - 1; - ay = area->widget->getTermY() - 1; + ax = area->x_offset; + ay = area->y_offset; aw = area->width; ah = area->height; rsh = area->right_shadow; @@ -674,18 +687,18 @@ bool FVTerm::updateVTermCursor (FVTerm::term_area* area) if ( area->input_cursor_visible ) { int cx, cy, ax, ay, x, y; - // cursor position - cx = area->input_cursor_x; - cy = area->input_cursor_y; - // widget position + // area offset ax = area->widget->getTermX() - 1; ay = area->widget->getTermY() - 1; - // area position + // area cursor position + cx = area->input_cursor_x; + cy = area->input_cursor_y; + // terminal position x = ax + cx; y = ay + cy; if ( isInsideArea(cx, cy, area) - && isInsideTerminal(x+1, y+1) + && isInsideTerminal(x, y) && isCovered(x, y, area) == non_covered ) { vterm->input_cursor_x = x; @@ -1113,7 +1126,7 @@ void FVTerm::clearArea (FVTerm::term_area* area) } //---------------------------------------------------------------------- -FOptiAttr::char_data FVTerm::getCharacter ( int type +FOptiAttr::char_data FVTerm::getCharacter ( character_type type , const FPoint& pos , FVTerm* obj ) { @@ -1121,7 +1134,7 @@ FOptiAttr::char_data FVTerm::getCharacter ( int type } //---------------------------------------------------------------------- -FOptiAttr::char_data FVTerm::getCharacter ( int char_type +FOptiAttr::char_data FVTerm::getCharacter ( character_type char_type , int x , int y , FVTerm* obj ) @@ -1175,14 +1188,17 @@ FOptiAttr::char_data FVTerm::getCharacter ( int char_type if ( obj && *iter != obj && significant_char ) { term_area* win = (*iter)->getVWin(); - const FRect& geometry = (*iter)->getTermGeometryWithShadow(); + int win_x = win->x_offset; + int win_y = win->y_offset; + FRect geometry ( win_x + , win_y + , win->width + win->right_shadow + , win->height + win->bottom_shadow ); // window visible and contains current character - if ( win && win->visible && geometry.contains(x+1,y+1) ) + if ( win && win->visible && geometry.contains(x,y) ) { FOptiAttr::char_data* tmp; - int win_x = (*iter)->getTermX() - 1; - int win_y = (*iter)->getTermY() - 1; int line_len = win->width + win->right_shadow; tmp = &win->text[(y-win_y) * line_len + (x-win_x)]; @@ -1290,7 +1306,7 @@ void FVTerm::setTermXY (register int x, register int y) term_x = term_pos->getX(); term_y = term_pos->getY(); - + move_str = moveCursor (term_x, term_y, x, y); if ( move_str ) @@ -1345,7 +1361,7 @@ void FVTerm::createVTerm (const FRect& r) void FVTerm::createVTerm (int width, int height) { // initialize virtual terminal - createArea (width, height, 0, 0, vterm); + createArea (0, 0, width, height, 0, 0, vterm); } //---------------------------------------------------------------------- @@ -1358,7 +1374,7 @@ void FVTerm::resizeVTerm (const FRect& r) //---------------------------------------------------------------------- void FVTerm::resizeVTerm (int width, int height) { - resizeArea (width, height, 0, 0, vterm); + resizeArea (0, 0, width, height, 0, 0, vterm); } //---------------------------------------------------------------------- @@ -1472,7 +1488,7 @@ bool FVTerm::updateTerminalCursor() int x = vterm->input_cursor_x; int y = vterm->input_cursor_y; - if ( isInsideTerminal(x+1, y+1) ) + if ( isInsideTerminal(x, y) ) { setTermXY (x,y); showCursor(); @@ -1515,7 +1531,7 @@ void FVTerm::processTerminalUpdate() bool FVTerm::isInsideTerminal (int x, int y) { // Check whether the coordinates are within the virtual terminal - FRect term_geometry (1, 1, getColumnNumber(), getLineNumber()); + FRect term_geometry (0, 0, getColumnNumber(), getLineNumber()); if ( term_geometry.contains(x,y) ) return true; @@ -1642,17 +1658,13 @@ int FVTerm::print (FVTerm::term_area* area, const std::string& s) int FVTerm::print (FString& s) { assert ( ! s.isNull() ); - term_area* area; - FWidget* w; - w = static_cast(this); - area = w->getPrintArea(); + term_area* area = getPrintArea(); if ( ! area ) { - FWidget* root = w->getRootWidget(); - area = vdesktop; - - if ( ! root ) + if ( vdesktop ) + area = vdesktop; + else return -1; } @@ -1666,23 +1678,23 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) register int len = 0; const wchar_t* p; uInt tabstop = getTabstop(); - FWidget* window; if ( ! area ) return -1; - window = area->widget; - - if ( ! window ) - return -1; - p = s.wc_str(); if ( p ) { while ( *p ) { - int rsh, bsh; + int x_offset, y_offset, width, height, rsh, bsh; + x_offset = area->x_offset; + y_offset = area->y_offset; + width = area->width; + height = area->height; + rsh = area->right_shadow; + bsh = area->bottom_shadow; switch ( *p ) { @@ -1711,8 +1723,8 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) default: { - short x = short(cursor->getX()); - short y = short(cursor->getY()); + short x = short(cursor->getX() - 1); + short y = short(cursor->getY() - 1); FOptiAttr::char_data nc; // next character nc.code = *p; @@ -1735,8 +1747,8 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) nc.trans_shadow = next_attribute.trans_shadow; nc.inherit_bg = next_attribute.inherit_bg; - int ax = x - window->getTermX(); - int ay = y - window->getTermY(); + int ax = x - x_offset; + int ay = y - y_offset; if ( area && ax >= 0 && ay >= 0 @@ -1779,17 +1791,13 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) } } - rsh = area->right_shadow; - bsh = area->bottom_shadow; - const FRect& area_geometry = window->getTermGeometry(); - - if ( cursor->x_ref() > area_geometry.getX2()+rsh ) + if ( cursor->x_ref() > x_offset + width + rsh ) { - cursor->x_ref() = short(window->getTermX()); + cursor->x_ref() = short(x_offset + 1); cursor->y_ref()++; } - if ( cursor->y_ref() > area_geometry.getY2()+bsh ) + if ( cursor->y_ref() > y_offset + height + bsh ) { cursor->y_ref()--; break; @@ -1808,17 +1816,13 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) //---------------------------------------------------------------------- int FVTerm::print (register int c) { - term_area* area; - FWidget* w; - w = static_cast(this); - area = w->getPrintArea(); + term_area* area = getPrintArea(); if ( ! area ) { - FWidget* root = w->getRootWidget(); - area = vdesktop; - - if ( ! root ) + if ( vdesktop ) + area = vdesktop; + else return -1; } @@ -1829,13 +1833,19 @@ int FVTerm::print (register int c) int FVTerm::print (FVTerm::term_area* area, register int c) { FOptiAttr::char_data nc; // next character - FWidget* window; - int rsh, bsh, ax, ay; + int x_offset, y_offset, width, height, rsh, bsh, ax, ay; short x, y; if ( ! area ) return -1; + x_offset = area->x_offset; + y_offset = area->y_offset; + width = area->width; + height = area->height; + rsh = area->right_shadow; + bsh = area->bottom_shadow; + nc.code = c; nc.fg_color = next_attribute.fg_color; nc.bg_color = next_attribute.bg_color; @@ -1856,15 +1866,10 @@ int FVTerm::print (FVTerm::term_area* area, register int c) nc.trans_shadow = next_attribute.trans_shadow; nc.inherit_bg = next_attribute.inherit_bg; - x = short(cursor->getX()); - y = short(cursor->getY()); - window = area->widget; - - if ( ! window ) - return -1; - - ax = x - window->getTermX(); - ay = y - window->getTermY(); + x = short(cursor->getX() - 1); + y = short(cursor->getY() - 1); + ax = x - x_offset; + ay = y - y_offset; if ( ax >= 0 && ay >= 0 && ax < area->width + area->right_shadow @@ -1904,17 +1909,14 @@ int FVTerm::print (FVTerm::term_area* area, register int c) } cursor->x_ref()++; - rsh = area->right_shadow; - bsh = area->bottom_shadow; - const FRect& area_geometry = window->getTermGeometry(); - if ( cursor->x_ref() > area_geometry.getX2()+rsh ) + if ( cursor->x_ref() > x_offset + width + rsh ) { - cursor->x_ref() = short(window->getTermX()); + cursor->x_ref() = short(x_offset + 1); cursor->y_ref()++; } - if ( cursor->y_ref() > area_geometry.getY2()+bsh ) + if ( cursor->y_ref() > y_offset + height + bsh ) { cursor->y_ref()--; updateVTerm (area); diff --git a/src/fvterm.h b/src/fvterm.h index 4a98e878..6634e680 100644 --- a/src/fvterm.h +++ b/src/fvterm.h @@ -84,6 +84,8 @@ class FVTerm : public FObject, public FTerm typedef struct { + int x_offset; + int y_offset; int width; int height; int right_shadow; @@ -106,9 +108,9 @@ class FVTerm : public FObject, public FTerm protected: void createArea (const FRect&, const FPoint&, FVTerm::term_area*&); - void createArea (int, int, int, int, FVTerm::term_area*&); + void createArea (int, int, int, int, int, int, FVTerm::term_area*&); static void resizeArea (const FRect&, const FPoint&, FVTerm::term_area*); - static void resizeArea (int, int, int, int, FVTerm::term_area*); + static void resizeArea (int, int, int, int, int, int, FVTerm::term_area*); static void removeArea (FVTerm::term_area*&); static void restoreVTerm (const FRect&); static void restoreVTerm (int, int, int, int); @@ -129,8 +131,8 @@ class FVTerm : public FObject, public FTerm static void scrollAreaForward (FVTerm::term_area*); static void scrollAreaReverse (FVTerm::term_area*); static void clearArea (FVTerm::term_area*); - static FOptiAttr::char_data getCharacter (int, const FPoint&, FVTerm*); - static FOptiAttr::char_data getCharacter (int, int, int, FVTerm*); + static FOptiAttr::char_data getCharacter (character_type, const FPoint&, FVTerm*); + static FOptiAttr::char_data getCharacter (character_type, int, int, FVTerm*); static FOptiAttr::char_data getCoveredCharacter (const FPoint&, FVTerm*); static FOptiAttr::char_data getCoveredCharacter (int, int, FVTerm*); static FOptiAttr::char_data getOverlappedCharacter (const FPoint&, FVTerm*); diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 255f8324..11795002 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -1293,7 +1293,9 @@ void FWidget::resize() if ( isRootWidget() ) { detectTermSize(); - const FRect& term_geometry = getGeometry(); + FRect term_geometry = getTermGeometry(); + term_geometry.move(-1,-1); + resizeVTerm (term_geometry); resizeArea (term_geometry, getShadow(), vdesktop); adjustSizeGlobal(); @@ -1584,17 +1586,10 @@ void FWidget::setPos (int x, int y, bool adjust) if ( y < 1 ) y = 1; + } - wsize.setX(x); - wsize.setY(y); - adjust_wsize.setX(x); - adjust_wsize.setY(y); - } - else - { - wsize.setPos(x,y); - adjust_wsize.setPos(x,y); - } + wsize.setPos(x,y); + adjust_wsize.setPos(x,y); if ( adjust ) adjustSize(); @@ -1863,17 +1858,10 @@ void FWidget::setGeometry (int x, int y, int w, int h, bool adjust) } //---------------------------------------------------------------------- -void FWidget::move (int x, int y) +void FWidget::move (int dx, int dy) { - if ( adjust_wsize.getX() == x && adjust_wsize.getY() == y ) - return; - - // Avoid to move widget completely outside the terminal - if ( x+getWidth() <= 1 || x > getMaxWidth() || y < 1 || y > getMaxHeight() ) - return; - - wsize.setPos(x,y); - adjust_wsize.setPos(x,y); + wsize.move(dx,dy); + adjust_wsize.move(dx,dy); } //---------------------------------------------------------------------- diff --git a/src/fwidget.h b/src/fwidget.h index 555517c1..02a513ea 100644 --- a/src/fwidget.h +++ b/src/fwidget.h @@ -475,8 +475,8 @@ class FWidget : public FVTerm void setColor(); // make every setColor from FVTerm available using FVTerm::setColor; - void setX (int, bool = true); - void setY (int, bool = true); + virtual void setX (int, bool = true); + virtual void setY (int, bool = true); virtual void setPos (const FPoint&, bool = true); virtual void setPos (int, int, bool = true); virtual void setWidth (int, bool = true); diff --git a/src/fwindow.cpp b/src/fwindow.cpp index 8d8f765d..a390411d 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -24,7 +24,9 @@ FWindow::FWindow(FWidget* parent) , normalGeometry() { setWindowWidget(); - createArea (getGeometry(), getShadow(), vwin); + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + createArea (geometry, getShadow(), vwin); addWindow (this); } @@ -144,10 +146,20 @@ void FWindow::onWindowLowered (FEvent*) //---------------------------------------------------------------------- void FWindow::adjustSize() { + int old_x = getX(); + int old_y = getY(); FWidget::adjustSize(); if ( zoomed ) setGeometry (1, 1, getMaxWidth(), getMaxHeight(), false); + else if ( vwin ) + { + if ( getX() != old_x ) + vwin->x_offset = getTermX() - 1; + + if ( getY() != old_y ) + vwin->y_offset = getTermY() - 1; + } } @@ -200,10 +212,8 @@ void FWindow::drawBorder() //---------------------------------------------------------------------- void FWindow::show() { - term_area* area = getVWin(); - - if ( area ) - area->visible = true; + if ( vwin ) + vwin->visible = true; FWidget::show(); } @@ -211,14 +221,48 @@ void FWindow::show() //---------------------------------------------------------------------- void FWindow::hide() { - term_area* area = getVWin(); - - if ( area ) - area->visible = false; + if ( vwin ) + vwin->visible = false; FWidget::hide(); } +//---------------------------------------------------------------------- +void FWindow::setX (int x, bool adjust) +{ + FWidget::setX (x, adjust); + + if ( vwin ) + vwin->x_offset = getTermX() - 1; +} + +//---------------------------------------------------------------------- +void FWindow::setY (int y, bool adjust) +{ + if ( y < 1 ) + y = 1; + + FWidget::setY (y, adjust); + + if ( vwin ) + vwin->y_offset = getTermY() - 1; +} + +//---------------------------------------------------------------------- +void FWindow::setPos (int x, int y, bool adjust) +{ + if ( y < 1 ) + y = 1; + + FWidget::setPos (x, y, adjust); + + if ( vwin ) + { + vwin->x_offset = getTermX() - 1; + vwin->y_offset = getTermY() - 1; + } +} + //---------------------------------------------------------------------- void FWindow::setWidth (int w, bool adjust) { @@ -226,7 +270,11 @@ void FWindow::setWidth (int w, bool adjust) FWidget::setWidth (w, adjust); if ( vwin && getWidth() != old_width ) - resizeArea (getGeometry(), getShadow(), vwin); + { + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + resizeArea (geometry, getShadow(), vwin); + } } //---------------------------------------------------------------------- @@ -236,7 +284,11 @@ void FWindow::setHeight (int h, bool adjust) FWidget::setHeight (h, adjust); if ( vwin && getHeight() != old_height ) - resizeArea (getGeometry(), getShadow(), vwin); + { + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + resizeArea (geometry, getShadow(), vwin); + } } //---------------------------------------------------------------------- @@ -247,18 +299,55 @@ void FWindow::setSize (int w, int h, bool adjust) FWidget::setSize (w, h, adjust); if ( vwin && (getWidth() != old_width || getHeight() != old_height) ) - resizeArea (getGeometry(), getShadow(), vwin); + { + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + resizeArea (geometry, getShadow(), vwin); + } } //---------------------------------------------------------------------- void FWindow::setGeometry (int x, int y, int w, int h, bool adjust) { + int old_x = getX(); + int old_y = getY(); int old_width = getWidth(); int old_height = getHeight(); + + if ( y < 1 ) + y = 1; + FWidget::setGeometry (x, y, w, h, adjust); - if ( vwin && (getWidth() != old_width || getHeight() != old_height) ) - resizeArea (getGeometry(), getShadow(), vwin); + if ( vwin ) + { + if ( getWidth() != old_width || getHeight() != old_height ) + { + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + resizeArea (geometry, getShadow(), vwin); + } + else + { + if ( getX() != old_x ) + vwin->x_offset = getTermX() - 1; + + if ( getY() != old_y ) + vwin->y_offset = getTermY() - 1; + } + } +} + +//---------------------------------------------------------------------- +void FWindow::move (int dx, int dy) +{ + FWidget::move (dx,dy); + + if ( vwin ) + { + vwin->x_offset = getTermX() - 1; + vwin->y_offset = getTermY() - 1; + } } //---------------------------------------------------------------------- @@ -699,10 +788,8 @@ bool FWindow::activateWindow (bool on) bool FWindow::isWindowHidden() const { // returns the window hidden state - term_area* area = getVWin(); - - if ( area ) - return ! area->visible; + if ( vwin ) + return ! vwin->visible; else return false; } @@ -770,7 +857,11 @@ void FWindow::setShadowSize (int right, int bottom) new_bottom = getShadow().getY(); if ( vwin && (new_right != old_right || new_bottom != old_bottom) ) - resizeArea (getGeometry(), getShadow(), vwin); + { + FRect geometry = getTermGeometry(); + geometry.move(-1,-1); + resizeArea (geometry, getShadow(), vwin); + } } //---------------------------------------------------------------------- diff --git a/src/fwindow.h b/src/fwindow.h index 91dc9631..cd4863c0 100644 --- a/src/fwindow.h +++ b/src/fwindow.h @@ -88,12 +88,20 @@ class FWindow : public FWidget virtual void drawBorder(); virtual void show(); virtual void hide(); + virtual void setX (int, bool = true); + virtual void setY (int, bool = true); + virtual void setPos (int, int, bool = true); + // make every setPos from FWidget available + using FWidget::setPos; virtual void setWidth (int, bool = true); virtual void setHeight (int, bool = true); virtual void setSize (int, int, bool = true); // make every setGeometry from FWidget available using FWidget::setGeometry; void setGeometry (int, int, int, int, bool = true); + virtual void move (int, int); + // make every move from FWidget available + using FWidget::move; static FWindow* getWindowWidgetAt (const FPoint&); static FWindow* getWindowWidgetAt (int, int); static void addWindow (FWidget*); diff --git a/test/windows.cpp b/test/windows.cpp index 80902931..b9e19715 100644 --- a/test/windows.cpp +++ b/test/windows.cpp @@ -539,7 +539,7 @@ void Window::adjustSize() if ( Y < 2) Y = 2; - move (X, Y); + setPos (X, Y); iter = begin = windows.begin(); while ( iter != windows.end() ) @@ -550,7 +550,7 @@ void Window::adjustSize() n = int(std::distance(begin, iter)); x = dx + 5 + (n%3)*25 + int(n/3)*3; y = dy + 11 + int(n/3)*3; - (*iter)->dgl->move (x, y); + (*iter)->dgl->setPos (x, y); } ++iter;