XkbOverlayRowPtr XkbAddGeomOverlayRow(XkbOverlayPtr overlay,int row_under,int sz_keys) { register int i; XkbOverlayRowPtr row; if ((!overlay)||(sz_keys<0)) return NULL; if (row_under>=overlay->section_under->num_rows) return NULL; for (i=0;i<overlay->num_rows;i++) { if (overlay->rows[i].row_under==row_under) { row= &overlay->rows[i]; if ((row->sz_keys<sz_keys)&& (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) { return NULL; } return &overlay->rows[i]; } } if ((overlay->num_rows>=overlay->sz_rows)&& (_XkbAllocOverlayRows(overlay,1)!=Success)) return NULL; row= &overlay->rows[overlay->num_rows]; bzero(row,sizeof(XkbOverlayRowRec)); if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success)) return NULL; row->row_under= row_under; overlay->num_rows++; return row; }
XkbOverlayKeyPtr XkbAddGeomOverlayKey(XkbOverlayPtr overlay, XkbOverlayRowPtr row, char *over, char *under) { register int i; XkbOverlayKeyPtr key; XkbSectionPtr section; XkbRowPtr row_under; Bool found; if ((!overlay) || (!row) || (!over) || (!under)) return NULL; section = overlay->section_under; if (row->row_under >= section->num_rows) return NULL; row_under = §ion->rows[row->row_under]; for (i = 0, found = FALSE; i < row_under->num_keys; i++) { if (strncmp(under, row_under->keys[i].name.name, XkbKeyNameLength) == 0) { found = TRUE; break; } } if (!found) return NULL; if ((row->num_keys >= row->sz_keys) && (_XkbAllocOverlayKeys(row, 1) != Success)) return NULL; key = &row->keys[row->num_keys]; strncpy(key->under.name, under, XkbKeyNameLength); strncpy(key->over.name, over, XkbKeyNameLength); row->num_keys++; return key; }
Status XkbAllocGeomOverlayKeys(XkbOverlayRowPtr row,int nKeys) { return _XkbAllocOverlayKeys(row,nKeys); }