Progress bar support is set of macros which allow simple usage of progress bar in the Partition Surprise, for passing progress information from low level to client interface.
Macros are defined in include/surprise/progress.h, some
supplementary functions used by macros are in
libsurprise/lib/progress.c
PROGRESS_SENSITIVITYconstant, the smallest change requested to redraw progress bar, value is in percentage.
PROGRESS_CALLBACK_FORCE()redraw progress bar
PROGRESS_CALLBACK()redraw progress bar if changed more than PROGRESS_SENSITIVITY
PROGRESS_CALLBACK_DECL(name)declaration of callback function, this is client function and is called from low levels. Also used for passing this callback function:
int (name)(struct progress_struct *progress_struct, const char *progress_message, ERR_PARAM)
progress_struct -
pointer to global structure with status
information about progress, contain history tree, etc. see
description of structure for details.progress_message -
message (note) to pass to userERR_PARAM -
passing error system
PROGRESS_SUBSECTION(w, min, max, title...)create new
subsection with title obtained by printf-like function of title...,
with weight w (in parent subsection), values between min and max.
Subsection must be closed by PROGRESS_ENDSUBSECTION, progress can't
be changed directly, must be used PROGRESS_SKIP() or PROGRESS_SECTION().
PROGRESS_SECTION(w, min, max, title...)create new section
with title obtained by printf-like function of title..., with weight w
in parent subsection, with values between min and max, changing
by PROGRESS_STATE(), PROGRESS_FINISH(). Has NO closing macro.
Note: PROGRESS_SECTION() and PROGRESS_SUBSECTION() macros can be
used without title, e.g. PROGRESS_SECTION(20.0,0.0,100.0), this creates
an anonymous section.
PROGRESS_ENDSUBSECTION()close top-level (current) subsection, finish all sections inside.
PROGRESS_MESSAGE(message...)pass printf-like formatted message to user, for passing to client is used callback function
PROGRESS_STATE(value)change status of current section
previously openned by PROGRESS_SECTION(), can't be used for subsection,
for subsection is similiar macro PROGRESS_SUB_STATE() which is quite
different and assumed for occasional use.
PROGRESS_SUB_STATE(value)change status of subsection, use ocassionally only, especially intented for increasing lucidity. Callback function is always called.
PROGRESS_FINISH()finish current section, state of section is set simly to its maximal value
PROGRESS_SKIP(w)create anonymous and empty section,
used if some section has no meaning and may be skipped, weight of this
anonymous section is w.
PROGRESS_PARAMfor passing progress status information
through calls, this is declaration in function header, function obtains
pointer to global structure progress_struct
PROGRESS_PASSpasses progress to call, corresponding
parameter was declared by PROGRESS_PARAM
PROGRESS_ABORTING()return boolean if Partition Surprise is aborting.
PROGRESS_CHECK(error)report error if Partition Surprise is aborting
PROGRESS_BREAKbreak cycle if PS is aborting
PROGRESS_INIT_DECLdeclaration of global structure which is everywhere passed through calls.
PROGRESS_INIT(callback, title)initialize global progress structure, callback is callback redrawing function of client which is
occasionally called from lower levels. Also creates main subsection with
specified title.
PROGRESS_DONE()free memory and cleanup in global structure
PROGRESS_GET()return progress of the main subsection, it is main progress bar.
PROGRESS_ON()check, if progress is passed, passing progress is not mandatory but optional
Structure struct progress_section represents one section or subsection
and in section tree and linklist.
struct progress_section {
int ps_is_subsection:1; /* flag for subsection */
char *ps_title;
float ps_weight;
float ps_min, ps_max;
float ps_value;
float ps_progress, ps_prev_progress;
struct progress_section *ps_parent;
struct progress_section *ps_lastsub;
struct progress_section *ps_sub;
struct progress_section *ps_next;
};
ps_is_subsectionflag if subsection or section only
ps_titletitle of this section, client may show this title together with this progress bar
ps_weightweight of the section in its parent section, changes of progress of this section also change progress of parent section.
ps_min, ps_maxminimal and maximal value of the section,
corresponding to macro PROGRESS_STATE() etc.
ps_valuevalue of this section, between ps_min and
ps_max
ps_progressprogress corresponding to ps_value,
simply computed from ps_value, ps_min, ps_max
ps_prev_progressprogress during last call callback function, used for testing if progress changed enough to redraw it, see PROGRESS_SENSITIVITY
ps_parentpointer to parent section or NULL for root section
ps_lastsublast child section, tail of linklist, needed to join next section
ps_subfirst child section, head of linklist, for logical browsing the section tree
ps_nextnext section in parent linklist
Structure struct progress_struct contains global information
about status of progress, is passed everywhere where is progress used
by macros PROGRESS_PARAM and PROGRESS_PASS, also this
structure is passed to callback function, therefore the client can
used full information about status.
This is description of the tree of sections, new level is created as
subsection by PROGRESS_SUBSECTION(), common section by PROGRESS_SECTION or PROGRESS_SKIP().
struct progress_struct {
struct progress_section *ps_current; /* current section... changed by PROGRESS_STATE() */
struct progress_section *ps_topsubsection; /* top subsection */
struct progress_section *ps_root; /* root of the section tree */
int ps_abort:1; /* flag to be aborted */
PROGRESS_CALLBACK_DECL(*ps_callback); /* callback */
char ps_buf[1024]; /* NULL_SNPRINTF passing buffer */
char *ps_message; /* current message passed to user */
};
ps_currentcurrent section, changing by PROGRESS_STATE()
ps_topsubsectiontoplevel subsection, this is subsection
which contains ps_current section.
ps_rootroot subsection, this is main progress bar, value returns PROGRESS_GET()
ps_abortflag if Partition Surprise is aborting, flag is set if callback function (client) return non-zero value
ps_callbackpointer to callback function in client
ps_bufsupplementar buffer
ps_messagemessage which may be passed to user through client