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