static void xfce_randr_populate (XfceRandr *randr, Display *xdisplay, GdkWindow *root_window) { GPtrArray *outputs; XRROutputInfo *output_info; XRRCrtcInfo *crtc_info; gint n; guint m; g_return_if_fail (randr != NULL); g_return_if_fail (randr->priv != NULL); g_return_if_fail (randr->priv->resources != NULL); /* prepare the temporary cache */ outputs = g_ptr_array_new (); /* walk the outputs */ for (n = 0; n < randr->priv->resources->noutput; ++n) { /* get the output info */ output_info = XRRGetOutputInfo (xdisplay, randr->priv->resources, randr->priv->resources->outputs[n]); /* forget about disconnected outputs */ if (output_info->connection != RR_Connected) { XRRFreeOutputInfo (output_info); continue; } /* cache it */ g_ptr_array_add (outputs, output_info); } /* migrate the temporary cache */ randr->noutput = outputs->len; randr->priv->output_info = (XRROutputInfo **) g_ptr_array_free (outputs, FALSE); /* allocate final space for the settings */ randr->mode = g_new0 (RRMode, randr->noutput); randr->priv->modes = g_new0 (XfceRRMode *, randr->noutput); randr->priv->position = g_new0 (XfceOutputPosition, randr->noutput); randr->rotation = g_new0 (Rotation, randr->noutput); randr->rotations = g_new0 (Rotation, randr->noutput); randr->relation = g_new0 (XfceOutputRelation, randr->noutput); randr->related_to = g_new0 (guint, randr->noutput); randr->status = g_new0 (XfceOutputStatus, randr->noutput); randr->friendly_name = g_new0 (gchar *, randr->noutput); /* walk the connected outputs */ for (m = 0; m < randr->noutput; ++m) { /* fill in supported modes */ randr->priv->modes[m] = xfce_randr_list_supported_modes (randr->priv->resources, randr->priv->output_info[m]); #ifdef HAS_RANDR_ONE_POINT_THREE /* find the primary screen if supported */ if (randr->priv->has_1_3 && XRRGetOutputPrimary (xdisplay, GDK_WINDOW_XID (root_window)) == randr->priv->resources->outputs[m]) randr->status[m] = XFCE_OUTPUT_STATUS_PRIMARY; else #endif randr->status[m] = XFCE_OUTPUT_STATUS_SECONDARY; if (randr->priv->output_info[m]->crtc != None) { crtc_info = XRRGetCrtcInfo (xdisplay, randr->priv->resources, randr->priv->output_info[m]->crtc); randr->mode[m] = crtc_info->mode; randr->rotation[m] = crtc_info->rotation; randr->rotations[m] = crtc_info->rotations; randr->priv->position[m].x = crtc_info->x; randr->priv->position[m].y = crtc_info->y; XRRFreeCrtcInfo (crtc_info); } else { /* output disabled */ randr->mode[m] = None; randr->rotation[m] = RR_Rotate_0; randr->rotations[m] = xfce_randr_get_safe_rotations (randr, xdisplay, m); } /* fill in the name used by the UI */ randr->friendly_name[m] = xfce_randr_friendly_name (randr, m); } /* calculate relations from positions */ xfce_randr_guess_relations (randr); }
static void xfce_randr_populate (XfceRandr *randr, Display *xdisplay, GdkWindow *root_window) { GPtrArray *outputs; XRROutputInfo *output_info; XRRCrtcInfo *crtc_info; gint n; guint m, connected; guint *output_ids = NULL; XfconfChannel *display_channel = xfconf_channel_new ("displays"); g_return_if_fail (randr != NULL); g_return_if_fail (randr->priv != NULL); g_return_if_fail (randr->priv->resources != NULL); /* prepare the temporary cache */ outputs = g_ptr_array_new (); output_ids = g_malloc0 (randr->priv->resources->noutput * sizeof (guint)); /* walk the outputs */ connected = 0; for (n = 0; n < randr->priv->resources->noutput; ++n) { /* get the output info */ output_info = XRRGetOutputInfo (xdisplay, randr->priv->resources, randr->priv->resources->outputs[n]); /* forget about disconnected outputs */ if (output_info->connection != RR_Connected) { XRRFreeOutputInfo (output_info); continue; } else { output_ids[connected] = n; connected++; } /* cache it */ g_ptr_array_add (outputs, output_info); } /* migrate the temporary cache */ randr->noutput = outputs->len; randr->priv->output_info = (XRROutputInfo **) g_ptr_array_free (outputs, FALSE); /* allocate final space for the settings */ randr->mode = g_new0 (RRMode, randr->noutput); randr->priv->modes = g_new0 (XfceRRMode *, randr->noutput); randr->position = g_new0 (XfceOutputPosition, randr->noutput); randr->rotation = g_new0 (Rotation, randr->noutput); randr->rotations = g_new0 (Rotation, randr->noutput); randr->mirrored = g_new0 (gboolean, randr->noutput); randr->status = g_new0 (XfceOutputStatus, randr->noutput); randr->friendly_name = g_new0 (gchar *, randr->noutput); /* walk the connected outputs */ for (m = 0; m < randr->noutput; ++m) { /* fill in supported modes */ randr->priv->modes[m] = xfce_randr_list_supported_modes (randr->priv->resources, randr->priv->output_info[m]); #ifdef HAS_RANDR_ONE_POINT_THREE /* find the primary screen if supported */ if (randr->priv->has_1_3 && XRRGetOutputPrimary (xdisplay, GDK_WINDOW_XID (root_window)) == randr->priv->resources->outputs[output_ids[m]]) randr->status[m] = XFCE_OUTPUT_STATUS_PRIMARY; else #endif randr->status[m] = XFCE_OUTPUT_STATUS_SECONDARY; if (randr->priv->output_info[m]->crtc != None) { crtc_info = XRRGetCrtcInfo (xdisplay, randr->priv->resources, randr->priv->output_info[m]->crtc); randr->mode[m] = crtc_info->mode; randr->rotation[m] = crtc_info->rotation; randr->rotations[m] = crtc_info->rotations; randr->position[m].x = crtc_info->x; randr->position[m].y = crtc_info->y; XRRFreeCrtcInfo (crtc_info); } else { /* output disabled */ randr->mode[m] = None; randr->rotation[m] = RR_Rotate_0; randr->rotations[m] = xfce_randr_get_safe_rotations (randr, xdisplay, m); } /* fill in the name used by the UI */ randr->friendly_name[m] = xfce_randr_friendly_name (randr, m, output_ids[m]); /* Update display info, primary display may have changed. */ xfce_randr_save_output (randr, "Default", display_channel, m); /* Replace spaces with underscore in name for xfconf compatibility */ g_strcanon(randr->priv->output_info[m]->name, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_<>", '_'); } /* populate mirrored details */ xfce_randr_guess_relations (randr); g_free (output_ids); }