randr: allocate hot-plugged outputs
authorSebastian Dransfeld <sd@tango.flipp.net>
Wed, 5 Mar 2014 11:05:53 +0000 (12:05 +0100)
committerSebastian Dransfeld <sd@tango.flipp.net>
Thu, 6 Mar 2014 14:18:14 +0000 (15:18 +0100)
src/bin/e_randr.c

index 280bed5..d8848cd 100644 (file)
@@ -622,55 +622,70 @@ _e_randr_event_cb_output_change(void *data EINA_UNUSED, int type EINA_UNUSED, vo
    output = _e_randr_output_find(ev->output);
    if (!output)
      {
-        fprintf(stderr, "E_RANDR: Weird, a new output?\n");
+        E_Config_Randr_Output *output_cfg = NULL;
+        Ecore_X_Window root;
+
+        root = ecore_x_window_root_first_get();
+
+        output = E_NEW(E_Randr_Output, 1);
+        if (!output) goto error;
+        output_cfg = _e_randr_config_output_find(ev->output);
+        if (!output_cfg)
+          output_cfg = _e_randr_config_output_new(root, ev->output);
+        if (!output_cfg) goto error;
+
+        e_randr->outputs = eina_list_append(e_randr->outputs, output);
+        output->cfg = output_cfg;
+
+        output->name = ecore_x_randr_output_name_get(root, output->cfg->xid, NULL);
+        output->is_lid = _e_randr_is_lid(output);
+        changed = EINA_TRUE;
      }
-   else
+
+   /* we know this output */
+   if (output->is_lid && _e_randr_lid_is_closed)
+     {
+        /* ignore event from disconnected lid */
+        fprintf(stderr, "E_RANDR: ignore event from closed lid\n");
+     }
+   else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED)
      {
-        /* we know this output */
-        if (output->is_lid && _e_randr_lid_is_closed)
+        E_Randr_Crtc *crtc = NULL;
+
+        /* connected */
+        if ((ev->crtc != 0) && (output->cfg->crtc != ev->crtc))
           {
-             /* ignore event from disconnected lid */
-             fprintf(stderr, "E_RANDR: ignore event from closed lid\n");
+             fprintf(stderr, "E_RANDR: output changed crtc\n");
+             /* remove from old crtc */
+             _e_randr_output_active_set(output, EINA_FALSE);
+             /* set new crtc on output */
+             output->cfg->crtc = ev->crtc;
           }
-        else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED)
+        if (!output->active)
           {
-             E_Randr_Crtc *crtc = NULL;
-
-             /* connected */
-             if ((ev->crtc != 0) && (output->cfg->crtc != ev->crtc))
+             fprintf(stderr, "E_RANDR: output connected to crtc\n");
+             crtc = _e_randr_output_crtc_find(output);
+             if (crtc)
                {
-                  fprintf(stderr, "E_RANDR: output changed crtc\n");
-                  /* remove from old crtc */
-                  _e_randr_output_active_set(output, EINA_FALSE);
-                  /* set new crtc on output */
-                  output->cfg->crtc = ev->crtc;
-               }
-             if (!output->active)
-               {
-                  fprintf(stderr, "E_RANDR: output connected to crtc\n");
-                  crtc = _e_randr_output_crtc_find(output);
-                  if (crtc)
-                    {
-                       /* connect to crtc */
-                       _e_randr_output_active_set(output, EINA_TRUE);
-                       /* get orientation from crtc if not set */
-                       if (!output->cfg->orient)
-                         output->cfg->orient = crtc->orient;
-                       /* validate output mode */
-                       _e_randr_output_mode_update(output);
-                    }
-                  changed = EINA_TRUE;
+                  /* connect to crtc */
+                  _e_randr_output_active_set(output, EINA_TRUE);
+                  /* get orientation from crtc if not set */
+                  if (!output->cfg->orient)
+                    output->cfg->orient = crtc->orient;
+                  /* validate output mode */
+                  _e_randr_output_mode_update(output);
                }
+             changed = EINA_TRUE;
           }
-        else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED)
+     }
+   else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED)
+     {
+        /* disconnected */
+        if (output->active)
           {
-             /* disconnected */
-             if (output->active)
-               {
-                  fprintf(stderr, "E_RANDR: output disconnected: %s\n", output->name);
-                  _e_randr_output_active_set(output, EINA_FALSE);
-                  changed = EINA_TRUE;
-               }
+             fprintf(stderr, "E_RANDR: output disconnected: %s\n", output->name);
+             _e_randr_output_active_set(output, EINA_FALSE);
+             changed = EINA_TRUE;
           }
      }
 
@@ -684,6 +699,9 @@ _e_randr_event_cb_output_change(void *data EINA_UNUSED, int type EINA_UNUSED, vo
      }
 
    return ECORE_CALLBACK_RENEW;
+error:
+   free(output);
+   return ECORE_CALLBACK_RENEW;
 }
 
 static Eina_Bool