Ticket #923: osd_core-fix.diff

File osd_core-fix.diff, 1.4 KB (added by claudio bley, 8 years ago)
  • navit/osd/core/osd_core.c

     
    243243        ) {
    244244                struct attr attr_to_set;
    245245                struct osd* osd;
    246                
     246                int t = 0;
    247247                if(ATTR_IS_STRING(attr_from_name(in[1]->u.str))) {
    248248                        attr_to_set.u.str = in[2]->u.str;
    249249                        attr_to_set.type = attr_from_name(in[1]->u.str);
     
    251251                else if(ATTR_IS_INT(attr_from_name(in[1]->u.str))) {
    252252                        attr_to_set.u.num = atoi(in[2]->u.str);
    253253                        attr_to_set.type = attr_from_name(in[1]->u.str);
     254                        t = 1;
    254255                }
    255256                else if(ATTR_IS_DOUBLE(attr_from_name(in[1]->u.str))) {
    256257                        double* val = g_new0(double,1);
    257258                        *val = atof(in[2]->u.str);
    258259                        attr_to_set.u.numd = val;
    259260                        attr_to_set.type = attr_from_name(in[1]->u.str);
     261                        t = 2;
    260262                }
    261263                osd = osd_get_osd_by_name(in[0]->u.str);
    262                 if(osd) {
    263                         osd_set_attr(osd, &attr_to_set);
     264                if(osd) {
     265                        struct attr old_attr;
     266                        if (osd_get_attr(osd, attr_to_set.type, &old_attr, NULL)) {
     267                                int changed = 0;
     268                                switch(t) {
     269                                case 0:
     270                                        changed = (strcmp(old_attr.u.str, attr_to_set.u.str) != 0);
     271                                        break;
     272                                case 1:
     273                                        changed = (old_attr.u.num != attr_to_set.u.num);
     274                                        break;
     275                                case 2:
     276                                        changed = (*old_attr.u.numd != *attr_to_set.u.numd);
     277                                        break;
     278                                }
     279                                if (changed) osd_set_attr(osd, &attr_to_set);
     280                        }
    264281                        val->u.num  = 1;
    265282                }
    266283        }