diff --git a/pw3270.cbp b/pw3270.cbp index c3937b0..e76dacd 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -197,7 +197,6 @@ - @@ -240,7 +239,6 @@ - diff --git a/src/lib3270/appres.h b/src/lib3270/appres.h index 48b5a51..416628c 100644 --- a/src/lib3270/appres.h +++ b/src/lib3270/appres.h @@ -220,12 +220,8 @@ typedef struct { LIB3270_INTERNAL AppRes appres; // FIXME (perry#2#): Check for right implementation -#if defined(LIB3270) - #define _( x ) x - #define N_( x ) x - #define MSG_( c, s ) s -#else - #define _( x ) x - #define N_( x ) x - #define MSG_( c, s ) get_message(c) -#endif +#define _( x ) x +#define N_( x ) x +#define MSG_( c, s ) s + +void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt); diff --git a/src/lib3270/glue.c b/src/lib3270/glue.c index 73895f3..d6df70b 100644 --- a/src/lib3270/glue.c +++ b/src/lib3270/glue.c @@ -165,6 +165,11 @@ void lib3270_session_free(H3270 *h) } +static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) +{ + +} + static void lib3270_session_init(H3270 *hSession, const char *model) { int ovc, ovr; @@ -173,6 +178,11 @@ static void lib3270_session_init(H3270 *hSession, const char *model) memset(hSession,0,sizeof(H3270)); hSession->sz = sizeof(H3270); + + // A few dummy calls to avoid "ifs" + hSession->update = update_char; + + hSession->sock = -1; hSession->model_num = -1; hSession->cstate = NOT_CONNECTED; diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index 589966e..4b78404 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -29,12 +29,134 @@ #include "globals.h" #include "ctlr.h" + #include "appres.h" #include #include #include /*--[ Implement ]------------------------------------------------------------------------------------*/ +static void update_selected_rectangle(H3270 *session) +{ + struct + { + int row; + int col; + } p[2]; + + int begin = session->selected.begin; + int end = session->selected.end; + int row, col, baddr; + + if(begin > end) + { + baddr = end; + end = begin; + begin = baddr; + } + + // Get start & end posision + p[0].row = (begin/session->cols); + p[0].col = (begin%session->cols); + p[1].row = (end/session->cols); + p[1].col = (end%session->cols); + + // First remove unselected areas + baddr = 0; + for(row=0;row < session->rows;row++) + { + for(col = 0; col < session->cols;col++) + { + if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) + { + ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED; + session->update(session,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == session->cursor_addr); + } + baddr++; + } + } + + // Then, draw selected ones + baddr = 0; + for(row=0;row < session->rows;row++) + { + for(col = 0; col < session->cols;col++) + { + if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) + { + ea_buf[baddr].attr |= LIB3270_ATTR_SELECTED; + session->update(session,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == session->cursor_addr); + } + baddr++; + } + } + +} + +static void update_selected_region(H3270 *session) +{ + int baddr; + int begin = session->selected.begin; + int end = session->selected.end; + int len = session->rows*session->cols; + + if(begin > end) + { + baddr = end; + end = begin; + begin = baddr; + } + + // First remove unselected areas + for(baddr = 0; baddr < begin; baddr++) + { + if(ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) + { + ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED; + session->update(session,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == session->cursor_addr); + } + } + + for(baddr = end+1; baddr < len; baddr++) + { + if(ea_buf[baddr].attr & LIB3270_ATTR_SELECTED) + { + ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED; + session->update(session,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == session->cursor_addr); + } + } + + // Then draw the selected ones + for(baddr = begin; baddr <= end; baddr++) + { + if(!(ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)) + { + ea_buf[baddr].attr |= LIB3270_ATTR_SELECTED; + session->update(session,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == session->cursor_addr); + } + } + +} + +void update_selection(H3270 *session) +{ + if(lib3270_get_toggle(session,LIB3270_TOGGLE_RECTANGLE_SELECT)) + update_selected_rectangle(session); + else + update_selected_region(session); +} + +void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt) +{ + if(session->selected.begin < 0) + return; + + if(t->value) + update_selected_rectangle(session); + else + update_selected_region(session); +} + LIB3270_EXPORT void lib3270_clear_selection(H3270 *session) { int a; @@ -55,6 +177,7 @@ LIB3270_EXPORT void lib3270_clear_selection(H3270 *session) } } + LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) { CHECK_SESSION_HANDLE(session); @@ -62,32 +185,9 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) if(session->selected.begin < 0) session->selected.begin = session->selected.end = session->cursor_addr; - if(baddr > session->cursor_addr) - { - session->selected.begin = session->cursor_addr; - session->selected.end = baddr; - } - else - { - session->selected.begin = baddr; - session->selected.end = session->cursor_addr; - } - - // Update screen contents - for(baddr = 0; baddr < session->rows*session->cols; baddr++) - { - unsigned short attr = ea_buf[baddr].attr; + lib3270_set_cursor_address(session,session->selected.end = baddr); - if(baddr >= session->selected.begin && baddr <= session->selected.end) - attr |= LIB3270_ATTR_SELECTED; - else - attr &= ~LIB3270_ATTR_SELECTED; + update_selection(session); - if(attr != ea_buf[baddr].attr && session->update) - { - ea_buf[baddr].attr = attr; - session->update(session,baddr,ea_buf[baddr].chr,attr,baddr == session->cursor_addr); - } - } } diff --git a/src/lib3270/toggle.h b/src/lib3270/toggle.h index 9210658..61d48cd 100644 --- a/src/lib3270/toggle.h +++ b/src/lib3270/toggle.h @@ -26,7 +26,6 @@ * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) * licinio@bb.com.br (Licínio Luis Branco) * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) * */ @@ -67,21 +66,9 @@ #define LIB3270_TOGGLE_ID LIB3270_TOGGLE - #define register_3270_toggle_monitor(ix,callback) lib3270_register_tchange(NULL,ix,callback) - - // LIB3270_EXPORT void register_3270_toggle_monitor(LIB3270_TOGGLE_ID ix, void (*callback)(int value, LIB3270_TOGGLE_TYPE reason)); -// LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE_ID ix); - - LIB3270_EXPORT int set_3270_toggle(LIB3270_TOGGLE_ID ix, int value); - -// LIB3270_EXPORT const char * get_3270_toggle_name(LIB3270_TOGGLE_ID ix); -// LIB3270_EXPORT LIB3270_TOGGLE_ID get_3270_toggle_by_name(const char *name); #define get_3270_toggle_by_name(x) lib3270_get_toggle_id(x) - - LIB3270_EXPORT void update_toggle_actions(void); - // Compatibility macros #define register_tchange(ix,callback) register_3270_toggle_monitor(ix,callback) #define do_toggle(ix) lib3270_toggle(NULL,ix) diff --git a/src/lib3270/toggles.c b/src/lib3270/toggles.c index 45d0b27..a123a64 100644 --- a/src/lib3270/toggles.c +++ b/src/lib3270/toggles.c @@ -107,8 +107,6 @@ static void do_toggle_reason(H3270 *session, LIB3270_TOGGLE ix, LIB3270_TOGGLE_T if(session->update_toggle) session->update_toggle(session,ix,t->value,reason,toggle_names[ix]); -// notify_toggle_changed(session, ix, t->value, reason); - } LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value) @@ -157,6 +155,8 @@ void initialize_toggles(H3270 *session, struct toggle *toggle) toggle[f].upcall = toggle_nop; } + toggle[LIB3270_TOGGLE_RECTANGLE_SELECT].upcall = toggle_rectselect; + #if defined(X3270_TRACE) toggle[DS_TRACE].upcall = toggle_dsTrace; toggle[SCREEN_TRACE].upcall = toggle_screenTrace; -- libgit2 0.21.2