/** * @brief Destroys an OSD. * * @param osd ID of the OSD to destroy. */ int osd_destroy( unsigned int osd ) { int i; OSD_t *ll; for (i=0; i<array_size( osd_list ); i++) { ll = &osd_list[i]; if (ll->id != osd) continue; /* Clean up. */ osd_free( &osd_list[i] ); /* Remove. */ array_erase( &osd_list, &osd_list[i], &osd_list[i+1] ); /* Recalculate dimensions. */ osd_calcDimensions(); /* Remove the OSD, if empty. */ if (array_size(osd_list) == 0) osd_exit(); /* Done here. */ return 0; } WARN("OSD '%u' not found to destroy.", osd ); return 0; }
/** * @brief Destroys an OSD. * * @param osd ID of the OSD to destroy. */ int osd_destroy( unsigned int osd ) { OSD_t *ll, *lp; lp = NULL; for (ll = osd_list; ll != NULL; ll = ll->next) { /* Matches. */ if (ll->id == osd) { /* Remove from list. */ if (lp == NULL) osd_list = ll->next; else lp->next = ll->next; /* Free. */ osd_free( ll ); /* Recalculate dimensions. */ osd_calcDimensions(); return 0; } /* Save last iteration. */ lp = ll; } return -1; }
/** * @brief Creates an on-screen display. * * @param title Title of the display. * @param nitems Number of items in the display. * @param items Items in the display. * @return ID of newly created OSD. */ unsigned int osd_create( const char *title, int nitems, const char **items, int priority ) { int i, j, n, m, l, s, w, t, id; OSD_t *osd; /* Create. */ if (osd_list == NULL) osd_list = array_create( OSD_t ); osd = &array_grow( &osd_list ); memset( osd, 0, sizeof(OSD_t) ); osd->id = ++osd_idgen; osd->active = 0; /* Copy text. */ osd->title = strdup(title); osd->priority = priority; osd->msg = malloc( sizeof(char*) * nitems ); osd->items = malloc( sizeof(OSDmsg_s) * nitems ); osd->nitems = nitems; for (i=0; i<osd->nitems; i++) { osd->msg[i] = strdup( items[i] ); l = strlen(osd->msg[i]); /* Message length. */ n = 0; /* Text position. */ j = 0; /* Lines. */ m = 0; /* Allocated Memory. */ t = 0; /* Tabbed? */ osd->items[i].chunks = NULL; w = osd_w-osd_hyphenLen; while (n < l) { /* Test if tabbed. */ if (j==0) { if (items[i][n] == '\t') { t = 1; w = osd_w - osd_tabLen; } else { t = 0; w = osd_w - osd_hyphenLen; } } /* Get text size. */ s = gl_printWidthForText( &gl_smallFont, &items[i][n], w ); if ((j==0) && (t==1)) w -= osd_hyphenLen; if (j+1 > m) { if (m==0) m = 32; else m *= 2; osd->items[i].chunks = realloc( osd->items[i].chunks, m * sizeof(char*)); } /* Copy text over. */ if (j==0) { if (t==1) { osd->items[i].chunks[j] = malloc(s+4); nsnprintf( osd->items[i].chunks[j], s+4, " %s", &items[i][n+1] ); } else { osd->items[i].chunks[j] = malloc(s+3); nsnprintf( osd->items[i].chunks[j], s+3, "- %s", &items[i][n] ); } } else if (t==1) { osd->items[i].chunks[j] = malloc(s+4); nsnprintf( osd->items[i].chunks[j], s+4, " %s", &items[i][n] ); } else { osd->items[i].chunks[j] = malloc(s+1); nsnprintf( osd->items[i].chunks[j], s+1, "%s", &items[i][n] ); } /* Go to next line. */ n += s + 1; j++; } osd->items[i].nchunks = j; } /* Sort them buggers. */ id = osd->id; /* WE MUST SAVE THE ID BEFORE WE SORT. Or we get stuck with an invalid osd pointer. */ osd_sort(); /* Recalculate dimensions. */ osd_calcDimensions(); return id; }
/** * @brief Creates an on-screen display. * * @param title Title of the display. * @param nitems Number of items in the display. * @param items Items in the display. * @return ID of newly created OSD. */ unsigned int osd_create( const char *title, int nitems, const char **items, int priority ) { int i, j, n, m, l, s, w, t; OSD_t *osd, *ll; /* Create. */ osd = calloc( 1, sizeof(OSD_t) ); osd->next = NULL; osd->id = ++osd_idgen; osd->active = 0; /* Copy text. */ osd->title = strdup(title); osd->priority = priority; osd->msg = malloc( sizeof(char*) * nitems ); osd->items = malloc( sizeof(OSDmsg_s) * nitems ); osd->nitems = nitems; for (i=0; i<osd->nitems; i++) { osd->msg[i] = strdup( items[i] ); l = strlen(osd->msg[i]); /* Message length. */ n = 0; /* Text position. */ j = 0; /* Lines. */ m = 0; /* Allocated Memory. */ t = 0; /* Tabbed? */ osd->items[i].chunks = NULL; w = osd_w-osd_hyphenLen; while (n < l) { /* Test if tabbed. */ if (j==0) { if (items[i][n] == '\t') { t = 1; w = osd_w - osd_tabLen; } else { t = 0; w = osd_w - osd_hyphenLen; } } /* Get text size. */ s = gl_printWidthForText( &gl_smallFont, &items[i][n], w ); if ((j==0) && (t==1)) w -= osd_hyphenLen; if (j+1 > m) { m += 32; osd->items[i].chunks = realloc( osd->items[i].chunks, m * sizeof(char*)); } /* Copy text over. */ if (j==0) { if (t==1) { osd->items[i].chunks[j] = malloc(s+4); snprintf( osd->items[i].chunks[j], s+4, " %s", &items[i][n+1] ); } else { osd->items[i].chunks[j] = malloc(s+3); snprintf( osd->items[i].chunks[j], s+3, "- %s", &items[i][n] ); } } else if (t==1) { osd->items[i].chunks[j] = malloc(s+4); snprintf( osd->items[i].chunks[j], s+4, " %s", &items[i][n] ); } else { osd->items[i].chunks[j] = malloc(s+1); snprintf( osd->items[i].chunks[j], s+1, "%s", &items[i][n] ); } /* Go to next line. */ n += s + 1; j++; } osd->items[i].nchunks = j; } /* Append to linked list. */ if (osd_list == NULL) osd_list = osd; else { for (ll = osd_list; ll->next != NULL; ll = ll->next) { if (ll->next->priority > priority) { osd->next = ll->next; break; } } ll->next = osd; } /* Recalculate dimensions. */ osd_calcDimensions(); return osd->id; }