summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2011-10-08 17:05:19 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2011-10-08 17:05:19 +0000
commit809fe0d67eb39f9ec08bca65735241803bc923f3 (patch)
tree2eccce3ae1fe8c431f845242bb64297309b2fb9e
parent60d64987c7e97bae385efef62f73cdcd7d3b5257 (diff)
download2011-ddhardrescue-809fe0d67eb39f9ec08bca65735241803bc923f3.tar.gz
2011-ddhardrescue-809fe0d67eb39f9ec08bca65735241803bc923f3.tar.bz2
2011-ddhardrescue-809fe0d67eb39f9ec08bca65735241803bc923f3.zip
Correction du bug de zoom (c'était juste le calcul de "pos" qui était foireux).
Création des méthodes sliceDelete et slicesDelete et utilisation à la fin du main. git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@25 d3078510-dda0-49f1-841c-895ef4b7ec81
-rwxr-xr-xinc/slices.h2
-rw-r--r--src/cursesview.c28
-rw-r--r--src/ddhardrescue.c16
-rw-r--r--src/slices.c16
4 files changed, 39 insertions, 23 deletions
diff --git a/inc/slices.h b/inc/slices.h
index 1ed7775..4360d86 100755
--- a/inc/slices.h
+++ b/inc/slices.h
@@ -27,6 +27,7 @@ typedef struct {
} slices_t;
slice_t *sliceNew(address_t begin, address_t end, sliceStatus_t status, slice_t *next);
+void sliceDelete(slice_t *s);
// Return the numbers of slices after split (3 in the general case, 2 or 1 in particular cases. -1 is memory error)
int sliceSplit(slices_t *slices, slice_t *initialSlice, address_t splitAt, sliceStatus_t statusBefore, sliceStatus_t statusAt, sliceStatus_t statusAfter);
@@ -35,6 +36,7 @@ int sliceSplit(slices_t *slices, slice_t *initialSlice, address_t splitAt, slice
slices_t *slicesNewEmpty();
slices_t *slicesNewSingleton(address_t begin, address_t end, sliceStatus_t status);
+void slicesDelete(slices_t *slices);
void slicesAppend(slices_t *slices, slice_t *slice);
diff --git a/src/cursesview.c b/src/cursesview.c
index 36e125e..0b346fb 100644
--- a/src/cursesview.c
+++ b/src/cursesview.c
@@ -23,7 +23,7 @@ void print_in_middle(WINDOW *win, int starty, int startx, int width, char *strin
void makeWin(WINDOW **win, PANEL **panel, int h, int w, int y, int x, char title[]);
void cursesMainLoop(slices_evt_t *slicesEvt) {
- char msgViewedArea[255];
+ char msg[255];
int ch, i;
WINDOW *wins[CURSESWIN_COUNT];
@@ -59,6 +59,7 @@ void cursesMainLoop(slices_evt_t *slicesEvt) {
switch(ch) {
// Zoom handling
+ //FIXME : Do something less stupid. Try to reuse mouse event zoom code for keyboard
case KEY_F(5):
sliceDumpEnd=(sliceDumpBegin+sliceDumpEnd)/2;
break;
@@ -97,11 +98,10 @@ void cursesMainLoop(slices_evt_t *slicesEvt) {
// If we found a panel, dispatch the event if a listener is set
if (p != NULL) {
- dispatched=0;
mouseEventListener=(int (*)(MEVENT mevent, WINDOW *winDebug)) panel_userptr(p);
- if (mouseEventListener != NULL) dispatched=mouseEventListener(mevent, wins[0]);
+ dispatched=(mouseEventListener==NULL)?0:mouseEventListener(mevent, wins[0]);
if ( ! dispatched ) {
- // If no listener or event not consumed, use the default behavior : set the panel on top
+ // If no listener or event not consumed, use the default behavior : set the panel on top if BUTTON1_CLICKED
if ( (mevent.bstate & BUTTON1_CLICKED) == BUTTON1_CLICKED) {
top_panel(p);
}
@@ -110,13 +110,18 @@ void cursesMainLoop(slices_evt_t *slicesEvt) {
}
break;
#endif
+ default:
+ sprintf(msg, "Unhandled key ch==0x%x", ch);
+ wattron(wins[0], COLOR_PAIR(4));
+ mvwprintw(wins[0], 2, 0, msg);
+
}
doupdate();
- sprintf(msgViewedArea, "Viewing [%lli-%lli] of [%lli-%lli] working region ", sliceDumpBegin, sliceDumpEnd, slicesEvt->data->min, slicesEvt->data->max);
+ sprintf(msg, "Viewing [%lli-%lli] of [%lli-%lli] working region ", sliceDumpBegin, sliceDumpEnd, slicesEvt->data->min, slicesEvt->data->max);
wattron(wins[0], COLOR_PAIR(4));
- mvwprintw(wins[0], 1, 0, msgViewedArea);
+ mvwprintw(wins[0], 1, 0, msg);
pthread_mutex_unlock(&ncursesWriteMutex);
}
@@ -137,23 +142,26 @@ int winUpdateSliceDumpMouseEventListener(MEVENT mevent, WINDOW *winDebug) {
int pX, pY, maxX, maxY;
address_t delta;
float pos;
- char buf[255];
+ // For debugging char buf[255];
pY=mevent.y;
pX=mevent.x;
resb=wmouse_trafo(winUpdateSliceDump, &pY, &pX, false);
if ( resb == TRUE ) {
getmaxyx(winUpdateSliceDump, maxY, maxX);
- pos=(0.0f+pY*maxX+pX)/(maxY*maxX);
+ // First ligne (pY) is line 1 but first char (pX) is char 0 so we have to translate Y coords by -1
+ pos=(0.0f+(pY-1)*maxX+pX)/((maxY-1)*maxX-1);
delta=sliceDumpEnd-sliceDumpBegin;
sliceDumpBegin+=delta*pos/DEFAULT_ZOOM_FACTOR*(DEFAULT_ZOOM_FACTOR-1);
sliceDumpEnd-=delta*(1-pos)/DEFAULT_ZOOM_FACTOR*(DEFAULT_ZOOM_FACTOR-1);
}
-//FIXME : pb avec le zoom factor
- sprintf(buf, "Debug : pos==%f, sliceDumpEnd==%lli, sliceDumpBegin=%lli, delta==%lli", pos, sliceDumpEnd, sliceDumpBegin, delta);
+/*
+ // Debug code
+ sprintf(buf, "Debug : pX==%i, pY==%i, maxX==%i, maxY==%i, pos==%f, sliceDumpEnd==%lli, sliceDumpBegin=%lli, delta==%lli", pX, pY, maxX, maxY, pos, sliceDumpEnd, sliceDumpBegin, delta);
wattron(winDebug, COLOR_PAIR(4));
mvwprintw(winDebug, 2, 0, buf);
+*/
return 1;
}
diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c
index 67c061b..c83fffd 100644
--- a/src/ddhardrescue.c
+++ b/src/ddhardrescue.c
@@ -36,7 +36,7 @@ int main(int argc, char **argv) {
struct threadArgs tArgs;
// Algorithmic needs
- int res, i;
+ int res;
// Parse command-line arguments
res=parseArgs(argc, argv, &args);
@@ -101,18 +101,8 @@ int main(int argc, char **argv) {
//Resources desallocation
(void) pthread_mutex_destroy(&(slices.eventListenerMutex));
-
- //XXX Method for that
- slice_t *curr, *toFree;
- i=0; curr=slices.data->first;
- while (curr!=NULL) {
- i++;
- toFree=curr;
- curr=curr->next;
- free(toFree);
- }
- free(slices.data);
-
+ slicesDelete(slices.data);
+
return 0;
}
diff --git a/src/slices.c b/src/slices.c
index 36f7bb1..06fa1b7 100644
--- a/src/slices.c
+++ b/src/slices.c
@@ -20,6 +20,10 @@ slice_t *sliceNew(address_t begin, address_t end, sliceStatus_t status, slice_t
return s;
}
+void sliceDelete(slice_t *s) {
+ free(s);
+}
+
// Return the numbers of slices after split (3 in the general case, 2 or 1 in particular cases. -1 is memory error)
int sliceSplit(slices_t *slices, slice_t *initialSlice, address_t splitAt, sliceStatus_t statusBefore, sliceStatus_t statusAt, sliceStatus_t statusAfter) {
slice_t *secondSlice, *thirdSlice, *rightSlice;
@@ -122,6 +126,18 @@ slices_t *slicesNewSingleton(address_t begin, address_t end, sliceStatus_t statu
return ss;
}
+void slicesDelete(slices_t *ss) {
+ slice_t *curr, *toFree;
+
+ curr=ss->first;
+ while (curr!=NULL) {
+ toFree=curr;
+ curr=curr->next;
+ sliceDelete(toFree);
+ }
+ free(ss);
+}
+
void slicesAppend(slices_t *slices, slice_t *slice) {
pthread_mutex_lock(&(slices->writeOrConsistentReadMutex));