+CompositedMonitor *find_monitor_by_name(CompositedScreen *screen, char *name)
+{
+ unsigned i;
+
+ for(i=0; i<screen->nmonitors; ++i)
+ if(!strcmp(screen->monitors[i].name, name))
+ return &screen->monitors[i];
+
+ return NULL;
+}
+
+void update_geometry_correction(Compositor *compositor, CompositedScreen *screen)
+{
+ Atom prop_type;
+ int prop_format;
+ unsigned long overflow;
+ unsigned long names_length;
+ char *names;
+ unsigned long values_length;
+ short *values;
+ char *name_ptr;
+ unsigned i;
+
+ XGetWindowProperty(compositor->display, screen->root, compositor->monitors_atom, 0, 64, False, XA_STRING,
+ &prop_type, &prop_format, &names_length, &overflow, (unsigned char **)&names);
+ if(prop_type!=XA_STRING || prop_format!=8)
+ return;
+
+ XGetWindowProperty(compositor->display, screen->root, compositor->correction_atom, 0, 64, False, XA_INTEGER,
+ &prop_type, &prop_format, &values_length, &overflow, (unsigned char **)&values);
+ if(prop_type!=XA_INTEGER || prop_format!=16)
+ {
+ XFree(names);
+ return;
+ }
+
+ use_gl(compositor, screen);
+
+ name_ptr = names;
+ for(i=0; i*4<values_length; ++i)
+ {
+ CompositedMonitor *monitor;
+
+ if(name_ptr>=names+names_length)
+ break;
+
+ monitor = find_monitor_by_name(screen, name_ptr);
+ if(monitor)
+ {
+ monitor->keystone_vertical = values[i*4]/10000.0f;
+ monitor->cylinder_depth = values[i*4+1]/10000.0f;
+ monitor->vertical_center = values[i*4+2]/10000.0f;
+ monitor->perspective = values[i*4+3]/10000.0f;
+
+ if(monitor->enabled)
+ update_monitor_vertices(screen, monitor);
+ }
+
+ name_ptr += strlen(name_ptr)+1;
+ }
+
+ XFree(names);
+ XFree(values);
+}
+