+void FFOptions_OptPanel::show_tip(const char *tip)
+{
+ if( !tip ) return;
+ int len = strlen(tip);
+ if( len > (int)sizeof(tip_text)-1 ) len = sizeof(tip_text)-1;
+ strncpy(tip_text,tip,len);
+ tip_text[len] = 0;
+ int line_limit = 60;
+ int limit2 = line_limit/2;
+ int limit4 = line_limit/4-2;
+ char *cp = tip_text, *dp = cp+len;
+ int n; char *bp, *ep, *pp, *sp;
+ while( cp < dp ) {
+ for( ep=cp; ep<dp && *ep!='\n'; ++ep );
+ // target about half remaining line, constrain line_limit
+ if( (n=(ep-1-cp)/2) < limit2 || n > line_limit )
+ n = line_limit;
+ // search for last punct, last space before line_limit
+ for( bp=cp, pp=sp=0; --n>=0 && cp<ep; ++cp ) {
+ if( ispunct(*cp) && isspace(*(cp+1)) ) pp = cp;
+ else if( isspace(*cp) ) sp = cp;
+ }
+ // line not empty
+ if( cp < ep ) {
+ // first, after punctuation
+ if( pp && pp-bp >= limit4 )
+ cp = pp+1;
+ // then, on spaces
+ else if( sp ) {
+ cp = sp;
+ }
+ // last, on next space
+ else {
+ while( cp<dp && !isspace(*cp) ) ++cp;
+ }
+ // add new line
+ if( !*cp ) break;
+ *cp++ = '\n';
+ }
+ }
+ fwin->panel->set_tooltip(tip_text);
+ fwin->panel->show_tooltip();
+}
+