On Sun, 25 Jan 2015 13:56:34 +0000 Tom Hacohen <tom.haco...@samsung.com> said:
> Probably unintended, but this commit does a lot more than it says it > does. More specifically, you removed e_randr.[ch]. :) aaah shit. it pulled in my randr remove. see next commit - i was doing a bunch of things - in order to make elm widgets workin dialogs i had to fix this - i forgot about my git rm of these files. grrr. > On 25/01/15 13:50, Carsten Haitzler wrote: > > raster pushed a commit to branch master. > > > > http://git.enlightenment.org/core/enlightenment.git/commit/?id=ab975cc349d5b0b23bb227e23a4d818071a0ed1e > > > > commit ab975cc349d5b0b23bb227e23a4d818071a0ed1e > > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> > > Date: Sun Jan 25 22:38:44 2015 +0900 > > > > e - fix e widgets to use evas size hints - this unifies sizing elm vs e > > --- > > src/bin/e_randr.c | 1419 > > ---------------------------------------------------- src/bin/e_randr.h | > > 88 ---- src/bin/e_widget.c | 12 +- > > 3 files changed, 4 insertions(+), 1515 deletions(-) > > > > diff --git a/src/bin/e_randr.c b/src/bin/e_randr.c > > deleted file mode 100644 > > index 257e871..0000000 > > --- a/src/bin/e_randr.c > > +++ /dev/null > > @@ -1,1419 +0,0 @@ > > -#include "e.h" > > - > > -/* TODO: Handle orientation in stored config */ > > -/* TODO: Ignore xrandr events triggered by changes in acpi cb */ > > -/* TODO: Clone mode */ > > -/* TODO: Lid at (x, y) == (0, 0) always */ > > -/* TODO: Implement left-of, right-of, above and below placement relative > > for outputs */ - > > -/* local function prototypes */ > > -static Eina_Bool _e_randr_config_load(void); > > -static void _e_randr_config_new(void); > > -static void _e_randr_config_free(void); > > -static void _e_randr_free(void); > > -static Eina_Bool _e_randr_config_cb_timer(void *data); > > -static void _e_randr_load(void); > > -static void _e_randr_apply(void); > > -static void _e_randr_output_mode_update(E_Randr_Output > > *cfg); -static E_Config_Randr_Output *_e_randr_config_output_new(void); > > -static E_Config_Randr_Output *_e_randr_config_output_find(E_Randr_Output > > *output); -static E_Randr_Crtc *_e_randr_crtc_find > > (Ecore_X_Randr_Crtc xid); -static E_Randr_Output > > *_e_randr_output_find(Ecore_X_Randr_Output xid); -static > > void _e_randr_output_crtc_find(E_Randr_Output *output); - > > -static void _e_randr_config_mode_geometry(Ecore_X_Randr_Orientation > > orient, Eina_Rectangle *rect); -static void _e_randr_config_primary_update > > (void); - > > -static Eina_Bool _e_randr_event_cb_screen_change(void *data, int type, > > void *event); -static Eina_Bool _e_randr_event_cb_crtc_change(void *data, > > int type, void *event); -static Eina_Bool _e_randr_event_cb_output_change > > (void *data, int type, void *event); - > > -static void _e_randr_acpi_handler_add(void *data); > > -static int _e_randr_is_lid(E_Randr_Output *cfg); > > -static void _e_randr_crtc_from_outputs_set(E_Randr_Crtc *crtc); > > -static Eina_Bool _e_randr_lid_update(void); > > -static Eina_Bool _e_randr_output_mode_valid(Ecore_X_Randr_Mode mode, > > Ecore_X_Randr_Mode *modes, int nmodes); -static void > > _e_randr_output_active_set(E_Randr_Output *output, Eina_Bool connected); > > -//static int _e_randr_config_output_cmp(const void *a, const void > > *b); -static char *_e_randr_output_name_get(Ecore_X_Window root, > > Ecore_X_Randr_Output output); - -/* local variables */ > > -static Eina_List *_randr_event_handlers = NULL; > > -static E_Config_DD *_e_randr_edd = NULL; > > -static E_Config_DD *_e_randr_output_edd = NULL; > > - > > -static int _e_randr_lid_is_closed = 0; > > - > > -/* external variables */ > > -EAPI E_Config_Randr *e_randr_cfg = NULL; > > -EAPI E_Randr *e_randr = NULL; > > - > > -/* private internal functions */ > > -EINTERN Eina_Bool > > -e_randr_init(void) > > -{ > > - /* check if randr is available */ > > - if (!ecore_x_randr_query()) return EINA_FALSE; > > - > > - /* get initial lid status */ > > - _e_randr_lid_is_closed = (e_acpi_lid_status_get() == E_ACPI_LID_CLOSED); > > - > > - /* try to load config */ > > - if (!_e_randr_config_load()) > > - { > > - /* NB: We should probably print an error here */ > > - return EINA_FALSE; > > - } > > - > > - /* tell randr that we are interested in receiving events > > - * > > - * NB: Requires RandR >= 1.2 */ > > - if (ecore_x_randr_version_get() >= E_RANDR_VERSION_1_2) > > - { > > - Ecore_X_Window root = 0; > > - > > - if ((root = ecore_x_window_root_first_get())) > > - ecore_x_randr_events_select(root, EINA_TRUE); > > - > > - /* setup randr event listeners */ > > - E_LIST_HANDLER_APPEND(_randr_event_handlers, > > - ECORE_X_EVENT_SCREEN_CHANGE, > > - _e_randr_event_cb_screen_change, NULL); > > - E_LIST_HANDLER_APPEND(_randr_event_handlers, > > - ECORE_X_EVENT_RANDR_CRTC_CHANGE, > > - _e_randr_event_cb_crtc_change, NULL); > > - E_LIST_HANDLER_APPEND(_randr_event_handlers, > > - ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, > > - _e_randr_event_cb_output_change, NULL); > > - } > > - > > - /* delay setting up acpi handler, as acpi is init'ed after randr */ > > - ecore_job_add(_e_randr_acpi_handler_add, NULL); > > - > > - return EINA_TRUE; > > -} > > - > > -EINTERN int > > -e_randr_shutdown(void) > > -{ > > - /* check if randr is available */ > > - if (!ecore_x_randr_query()) return 1; > > - > > - if (ecore_x_randr_version_get() >= E_RANDR_VERSION_1_2) > > - { > > - Ecore_X_Window root = 0; > > - > > - /* tell randr that we are not interested in receiving events > > anymore */ > > - if ((root = ecore_x_window_root_first_get())) > > - ecore_x_randr_events_select(root, EINA_FALSE); > > - } > > - > > - /* remove event listeners */ > > - E_FREE_LIST(_randr_event_handlers, ecore_event_handler_del); > > - > > - /* free config */ > > - _e_randr_free(); > > - _e_randr_config_free(); > > - > > - /* free edd */ > > - E_CONFIG_DD_FREE(_e_randr_output_edd); > > - E_CONFIG_DD_FREE(_e_randr_edd); > > - > > - return 1; > > -} > > - > > -/* public API functions */ > > -EAPI Eina_Bool > > -e_randr_config_save(void) > > -{ > > - /* save the new config */ > > - return e_config_domain_save("e_randr", _e_randr_edd, e_randr_cfg); > > -} > > - > > -EAPI void > > -e_randr_config_apply(void) > > -{ > > - Eina_List *l; > > - E_Randr_Output *output; > > - > > - /* Update output mode */ > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - printf("RR: apply out %p... [%s]\n", output, output->name); > > - if ((output->cfg) && (!output->cfg->connect)) > > - { > > - printf("RR: output disabled\n"); > > - _e_randr_output_active_set(output, EINA_FALSE); > > - } > > - else if ((output->cfg) && (output->status == > > ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED)) > > - { > > - if (output->cfg) > > - { > > - printf("RR: output enabled [%i %i %ix%i | %2.3f orient % > > i]\n", > > - output->cfg->geo.x, output->cfg->geo.y, > > - output->cfg->geo.w, output->cfg->geo.h, > > - output->cfg->refresh_rate, output->cfg->orient); > > - printf("RR: update mode\n"); > > - _e_randr_output_mode_update(output); > > - printf("RR: active set...\n"); > > - _e_randr_output_active_set(output, EINA_TRUE); > > - printf("RR: active set done\n"); > > - } > > - else > > - printf("RR: no cfg\n"); > > - } > > - else > > - { > > - printf("RR: ???\n"); > > - } > > - } > > - printf("RR: ... lid update\n"); > > - /* update lid status */ > > - _e_randr_lid_update(); > > - > > - printf("RR: randr apply...\n"); > > - /* apply randr settings */ > > - _e_randr_apply(); > > - > > - printf("RR: update primary...\n"); > > - /* update primary output */ > > - _e_randr_config_primary_update(); > > -} > > - > > -EAPI double > > -e_randr_mode_refresh_rate_get(Ecore_X_Randr_Mode_Info *mode) > > -{ > > - double rate = 0.0; > > - > > - if (mode) > > - { > > - if ((mode->hTotal) && (mode->vTotal)) > > - rate = ((double)mode->dotClock / > > - ((double)mode->hTotal * (double)mode->vTotal)); > > - rate = round(rate); > > - } > > - > > - return rate; > > -} > > - > > -/* local functions */ > > -static Eina_Bool > > -_e_randr_config_load(void) > > -{ > > - Eina_Bool do_restore = EINA_TRUE; > > - > > - /* define edd for output config */ > > - _e_randr_output_edd = > > - E_CONFIG_DD_NEW("E_Config_Randr_Output", E_Config_Randr_Output); > > -#undef T > > -#undef D > > -#define T E_Config_Randr_Output > > -#define D _e_randr_output_edd > > - E_CONFIG_VAL(D, T, name, STR); > > - E_CONFIG_VAL(D, T, edid, STR); > > - E_CONFIG_VAL(D, T, orient, UINT); > > - E_CONFIG_VAL(D, T, geo.x, INT); > > - E_CONFIG_VAL(D, T, geo.y, INT); > > - E_CONFIG_VAL(D, T, geo.w, INT); > > - E_CONFIG_VAL(D, T, geo.h, INT); > > - E_CONFIG_VAL(D, T, refresh_rate, DOUBLE); > > - E_CONFIG_VAL(D, T, connect, UCHAR); > > - > > - /* define edd for randr config */ > > - _e_randr_edd = E_CONFIG_DD_NEW("E_Config_Randr", E_Config_Randr); > > -#undef T > > -#undef D > > -#define T E_Config_Randr > > -#define D _e_randr_edd > > - E_CONFIG_VAL(D, T, version, INT); > > - E_CONFIG_LIST(D, T, outputs, _e_randr_output_edd); > > - E_CONFIG_VAL(D, T, restore, UCHAR); > > - E_CONFIG_VAL(D, T, config_timestamp, ULL); > > - // TODO: primary must be name + edid > > - E_CONFIG_VAL(D, T, primary, UINT); > > - > > - /* try to load the randr config */ > > - if ((e_randr_cfg = e_config_domain_load("e_randr", _e_randr_edd))) > > - { > > - /* check randr config version */ > > - if (e_randr_cfg->version < (E_RANDR_CONFIG_FILE_EPOCH * 1000000)) > > - { > > - /* config is too old */ > > - do_restore = EINA_FALSE; > > - _e_randr_config_free(); > > - ecore_timer_add(1.0, _e_randr_config_cb_timer, > > - _("Settings data needed upgrading. Your old > > settings have<br>" > > - "been wiped and a new set of defaults > > initialized. This<br>" > > - "will happen regularly during development, > > so don't report a<br>" > > - "bug. This simply means Enlightenment needs > > new settings<br>" > > - "data by default for usable functionality > > that your old<br>" > > - "settings simply lack. This new set of > > defaults will fix<br>" > > - "that by adding it in. You can re-configure > > things now to your<br>" > > - "liking. Sorry for the hiccup in your > > settings.<br>")); > > - } > > - else if (e_randr_cfg->version > E_RANDR_CONFIG_FILE_VERSION) > > - { > > - /* config is too new */ > > - do_restore = EINA_FALSE; > > - _e_randr_config_free(); > > - ecore_timer_add(1.0, _e_randr_config_cb_timer, > > - _("Your settings are NEWER than > > Enlightenment. This is very<br>" > > - "strange. This should not happen unless you > > downgraded<br>" > > - "Enlightenment or copied the settings from > > a place where<br>" > > - "a newer version of Enlightenment was > > running. This is bad and<br>" > > - "as a precaution your settings have been > > now restored to<br>" > > - "defaults. Sorry for the > > inconvenience.<br>")); > > - } > > - } > > - > > - /* if config was too old or too new, then reload a fresh one */ > > - if (!e_randr_cfg) > > - { > > - _e_randr_config_new(); > > - do_restore = EINA_FALSE; > > - } > > - else > > - { > > -#define CONFIG_VERSION_CHECK(VERSION) \ > > - if (e_randr_cfg->version - (E_RANDR_CONFIG_FILE_EPOCH * 1000000) < > > (VERSION)) > > - CONFIG_VERSION_CHECK(4) > > - { > > - E_Config_Randr_Output *output; > > - Eina_List *l; > > - > > - /* Set refresh_rate to 60 */ > > - EINA_LIST_FOREACH(e_randr_cfg->outputs, l, output) > > - if (dblequal(output->refresh_rate, 0.0)) > > output->refresh_rate = 60.0; > > - } > > - } > > - > > - if (!e_randr_cfg) return EINA_FALSE; > > - > > - _e_randr_load(); > > - e_randr_config_save(); > > - > > - if ((do_restore) && (e_randr_cfg->restore)) > > - { > > - _e_randr_apply(); > > - } > > - > > - return EINA_TRUE; > > -} > > - > > -static void > > -_e_randr_config_new(void) > > -{ > > - Ecore_X_Window root = 0; > > - > > - /* create new randr cfg */ > > - if (!(e_randr_cfg = E_NEW(E_Config_Randr, 1))) > > - return; > > - > > - /* grab the root window once */ > > - root = ecore_x_window_root_first_get(); > > - > > - /* set version */ > > - e_randr_cfg->version = E_RANDR_CONFIG_FILE_VERSION; > > - > > - /* by default, restore config */ > > - e_randr_cfg->restore = EINA_TRUE; > > - > > - /* remember current primary */ > > - e_randr_cfg->primary = ecore_x_randr_primary_output_get(root); > > - > > - /* update recorded config timestamp */ > > - e_randr_cfg->config_timestamp = ecore_x_randr_config_timestamp_get > > (root); -} > > - > > -static void > > -_e_randr_config_free(void) > > -{ > > - E_Config_Randr_Output *output = NULL; > > - > > - /* safety check */ > > - if (!e_randr_cfg) return; > > - > > - /* loop the config outputs and free them */ > > - EINA_LIST_FREE(e_randr_cfg->outputs, output) > > - { > > - E_FREE(output); > > - } > > - > > - /* free the config */ > > - E_FREE(e_randr_cfg); > > -} > > - > > -static void > > -_e_randr_free(void) > > -{ > > - E_Randr_Crtc *crtc = NULL; > > - E_Randr_Output *output = NULL; > > - > > - /* safety check */ > > - if (!e_randr) return; > > - > > - /* loop the crtcs and free them */ > > - EINA_LIST_FREE(e_randr->crtcs, crtc) > > - { > > - free(crtc); > > - } > > - > > - /* loop the outputs and free them */ > > - EINA_LIST_FREE(e_randr->outputs, output) > > - { > > - free(output->name); > > - free(output->edid); > > - free(output); > > - } > > - > > - /* free the config */ > > - E_FREE(e_randr); > > -} > > - > > -static Eina_Bool > > -_e_randr_config_cb_timer(void *data) > > -{ > > - e_util_dialog_show(_("Randr Settings Upgraded"), "%s", (char *)data); > > - return EINA_FALSE; > > -} > > - > > -static char * > > -_e_randr_output_edid_string_get(Ecore_X_Window root, Ecore_X_Randr_Output > > output) -{ > > - unsigned char *edid = NULL; > > - unsigned long edid_len = 0; > > - char *edid_str = NULL; > > - > > - edid = ecore_x_randr_output_edid_get(root, output, &edid_len); > > - if (edid) > > - { > > - unsigned int k, kk; > > - > > - edid_str = malloc((edid_len * 2) + 1); > > - if (edid_str) > > - { > > - const char *hexch = "0123456789abcdef"; > > - > > - for (kk = 0, k = 0; k < edid_len; k++) > > - { > > - edid_str[kk ] = hexch[(edid[k] >> 4) & 0xf]; > > - edid_str[kk + 1] = hexch[ edid[k] & 0xf]; > > - kk += 2; > > - } > > - edid_str[kk] = 0; > > - } > > - free(edid); > > - } > > - return edid_str; > > -} > > - > > -/* function to map X's settings with E's settings */ > > -static void > > -_e_randr_load(void) > > -{ > > - Ecore_X_Window root = 0; > > - Ecore_X_Randr_Output *outputs = NULL; > > - int noutputs = 0; > > - Ecore_X_Randr_Crtc *crtcs = NULL; > > - int ncrtcs = 0, i = 0; > > - > > - e_randr = E_NEW(E_Randr, 1); > > - if (!e_randr) return; > > - > > - /* grab the root window once */ > > - root = ecore_x_window_root_first_get(); > > - > > - /* try to get the list of crtcs from x */ > > - if ((crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs))) > > - { > > - /* loop the crtcs */ > > - for (i = 0; i < ncrtcs; i++) > > - { > > - E_Randr_Crtc *crtc; > > - Ecore_X_Randr_Crtc_Info *cinfo; > > - > > - crtc = E_NEW(E_Randr_Crtc, 1); > > - if (!crtc) continue; > > - e_randr->crtcs = eina_list_append(e_randr->crtcs, crtc); > > - crtc->xid = crtcs[i]; > > - > > - /* get crtc info from X */ > > - if ((cinfo = ecore_x_randr_crtc_info_get(root, crtc->xid))) > > - { > > - crtc->geo.x = cinfo->x; > > - crtc->geo.y = cinfo->y; > > - crtc->geo.w = cinfo->width; > > - crtc->geo.h = cinfo->height; > > - crtc->mode = cinfo->mode; > > - crtc->orient = cinfo->rotation; > > - > > - ecore_x_randr_crtc_info_free(cinfo); > > - } > > - printf("RR: crtc found %x | %i %i %ix%i - %x . %i\n", > > - crtc->xid, > > - crtc->geo.x, crtc->geo.y, crtc->geo.w, crtc->geo.h, > > - crtc->mode, crtc->orient); > > - } > > - > > - free(crtcs); > > - } > > - printf("RR: ====================\n"); > > - /* try to get the list of outputs from x */ > > - if ((outputs = ecore_x_randr_outputs_get(root, &noutputs))) > > - { > > - int j = 0; > > - > > - for (j = 0; j < noutputs; j++) > > - { > > - E_Randr_Output *output = NULL; > > - Eina_Bool unknown = EINA_FALSE; > > - > > - output = E_NEW(E_Randr_Output, 1); > > - if (!output) continue; > > - > > - e_randr->outputs = eina_list_append(e_randr->outputs, output); > > - output->xid = outputs[j]; > > - output->name = _e_randr_output_name_get(root, output->xid); > > - output->is_lid = _e_randr_is_lid(output); > > - output->edid = _e_randr_output_edid_string_get(root, outputs > > [j]); > > - output->status = ecore_x_randr_output_connection_status_get > > (root, output->xid); > > - output->cfg = _e_randr_config_output_find(output); > > - if (!output->cfg) > > - { > > - output->cfg = _e_randr_config_output_new(); > > - if (output->name) output->cfg->name = strdup > > (output->name); > > - if (output->edid) output->cfg->edid = strdup > > (output->edid); > > - unknown = EINA_TRUE; > > - } > > - printf("RR: output %x %s %i %p\n", output->xid, output->name, > > output->status, output->cfg); - > > - /* find a crtc if we want this output connected */ > > - if (output->cfg->connect && > > - (output->status == > > ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED)) > > - { > > - _e_randr_output_active_set(output, EINA_TRUE); > > - > > - if (output->crtc) > > - { > > - printf("RR: ouput on crtc = %p\n", output->crtc); > > - /* get orientation from crtc if not set */ > > - if (!output->cfg->orient) > > - output->cfg->orient = output->crtc->orient; > > - /* find mode for output */ > > - _e_randr_output_mode_update(output); > > - /* set position from crtc if unknown */ > > - if (unknown) > > - { > > - output->cfg->geo.x = output->crtc->geo.x; > > - output->cfg->geo.y = output->crtc->geo.y; > > - } > > - } > > - } > > - } > > - > > - free(outputs); > > - } > > - > > - /* update lid status */ > > - _e_randr_lid_update(); > > - > > - /* update primary output */ > > - _e_randr_config_primary_update(); > > - > > - /* update recorded config timestamp */ > > - e_randr_cfg->config_timestamp = ecore_x_randr_config_timestamp_get > > (root); - > > - /* save the config */ > > - e_randr_config_save(); > > -} > > - > > -static void > > -_e_randr_apply(void) > > -{ > > - E_Randr_Crtc *crtc; > > - Eina_List *l; > > - Ecore_X_Window root = 0; > > - int nw = 0, nh = 0; > > - int minw = 0, minh = 0; > > - int maxw = 0, maxh = 0; > > - int nx = INT_MAX, ny = INT_MAX; > > - > > - /* don't try to restore if we have fake screens */ > > - if (e_xinerama_fake_screens_exist()) return; > > - > > - /* grab the X server so that we can apply settings without triggering > > - * any randr event updates until we are done */ > > - ecore_x_grab(); > > - > > - /* get the root window */ > > - root = ecore_x_window_root_first_get(); > > - > > - /* get the min and max screen size */ > > - ecore_x_randr_screen_size_range_get(root, &minw, &minh, &maxw, &maxh); > > - printf("RRR0: size range: %ix%i -> %ix%i\n", minw, minh, maxw, maxh); > > - nx = maxw; > > - ny = maxh; > > - nw = nh = 0; > > - EINA_LIST_FOREACH(e_randr->crtcs, l, crtc) > > - { > > - int x = 0, y = 0, w = 0, h = 0; > > - Ecore_X_Randr_Orientation orient = ECORE_X_RANDR_ORIENTATION_ROT_0; > > - Eina_Rectangle rect; > > - > > - printf("RRR0: crtc: %x %i %i %ix%i rot: %i mode: %i\n", > > crtc->xid, crtc->geo.x, crtc->geo.y, crtc->geo.w, crtc->geo.h, > > crtc->orient, crtc->mode); > > - if (!crtc->outputs) continue; > > - _e_randr_crtc_from_outputs_set(crtc); > > - if (crtc->mode == 0) continue; > > - x = crtc->geo.x; > > - y = crtc->geo.y; > > - orient = crtc->orient; > > - rect = crtc->geo; > > - _e_randr_config_mode_geometry(orient, &rect); > > - w = rect.w; > > - h = rect.h; > > - if (((x + w) > maxw) || ((y + h) > maxh)) continue; > > - if ((x + w) > nw) nw = x + w; > > - if ((y + h) > nh) nh = y + h; > > - if (x < nx) nx = x; > > - if (y < ny) ny = y; > > - } > > - /* Adjust size according to origo */ > > - nw -= nx; > > - nh -= ny; > > - /* apply the new screen size */ > > - printf("RRR1: current screen size: %ix%i\n", nw, nh); > > - ecore_x_randr_screen_current_size_set(root, nw, nh, -1, -1); > > - > > - nx = ny = nw = nh = 0; > > - /* loop our lists of crtcs */ > > - EINA_LIST_FOREACH(e_randr->crtcs, l, crtc) > > - { > > - E_Randr_Output *output; > > - Eina_List *ll; > > - int x = 0, y = 0, w = 0, h = 0; > > - Ecore_X_Randr_Mode mode = 0; > > - Ecore_X_Randr_Orientation orient = ECORE_X_RANDR_ORIENTATION_ROT_0; > > - Eina_Rectangle rect; > > - int count = 0; > > - Ecore_X_Randr_Output *coutputs; > > - > > - printf("RRR2: crtc: %x %i %i %ix%i rot: %i mode: %i\n", > > crtc->xid, crtc->geo.x, crtc->geo.y, crtc->geo.w, crtc->geo.h, > > crtc->orient, crtc->mode); > > - if (!crtc->outputs) > > - { > > - printf("RRR2: no outputs - off\n"); > > - ecore_x_randr_crtc_settings_set(root, crtc->xid, NULL, 0, 0, > > 0, 0, > > - > > ECORE_X_RANDR_ORIENTATION_ROT_0); > > - continue; > > - } > > - /* set config from connected outputs */ > > - _e_randr_crtc_from_outputs_set(crtc); > > - > > - x = crtc->geo.x; > > - y = crtc->geo.y; > > - mode = crtc->mode; > > - orient = crtc->orient; > > - > > - /* at this point, we should have geometry, mode and orientation. > > - * we can now proceed to calculate crtc size */ > > - rect = crtc->geo; > > - _e_randr_config_mode_geometry(orient, &rect); > > - w = rect.w; > > - h = rect.h; > > - > > - /* if the crtc does not fit, disable it */ > > - if (((x + w) > maxw) || ((y + h) > maxh) || (mode == 0)) > > - { > > - printf("RRR2: crtc dose not fit - off\n"); > > - ecore_x_randr_crtc_settings_set(root, crtc->xid, NULL, 0, 0, > > 0, 0, > > - > > ECORE_X_RANDR_ORIENTATION_ROT_0); > > - continue; > > - } > > - > > - /* find outputs to enable on crtc */ > > - coutputs = calloc(eina_list_count(crtc->outputs), sizeof > > (Ecore_X_Randr_Output)); > > - if (!coutputs) > > - { > > - printf("RRR2: cannot alloc coutputs\n"); > > - continue; > > - } > > - EINA_LIST_FOREACH(crtc->outputs, ll, output) > > - { > > - /* TODO: If this condition isn't true, the output should not > > be in crtc->outputs. > > - * crtc->outputs should only contain valid outputs */ > > - if ((output->cfg) && (output->crtc == crtc) && (output->mode) > > && > > - (output->status == > > ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED)) > > - { > > - int i; > > - Eina_Bool ok; > > - > > - ok = EINA_TRUE; > > - /* TODO: This is wrong, one output shouldn't be twice in > > crtc list */ > > - for (i = 0; i < count; i++) > > - { > > - if (coutputs[i] == output->xid) > > - { > > - ok = EINA_FALSE; > > - printf("RRR: Error, same output twice on > > crtc."); > > - printf(" output: '%s' lid: %i active: %i > > status: %i\n", output->name, output->is_lid, output->active, > > output->status); > > - break; > > - } > > - } > > - if (ok) > > - { > > - printf("RRR2: add output %s\n", output->name); > > - coutputs[count] = output->xid; > > - count++; > > - } > > - } > > - } > > - > > - printf("RRR2: set mode %x | %i %i %ix%i | %x | %i\n", > > - crtc->xid, > > - crtc->geo.x, crtc->geo.y, crtc->geo.w, crtc->geo.h, > > - crtc->mode, crtc->orient); > > - /* apply our stored crtc settings */ > > - if (count > 0) > > - ecore_x_randr_crtc_settings_set(root, crtc->xid, coutputs, > > - count, crtc->geo.x, crtc->geo.y, > > - crtc->mode, crtc->orient); > > - else > > - { > > - printf("RRR2: no coutputs - off\n"); > > - ecore_x_randr_crtc_settings_set(root, crtc->xid, NULL, 0, 0, > > 0, 0, > > - > > ECORE_X_RANDR_ORIENTATION_ROT_0); > > - } > > - > > - /* cleanup */ > > - free(coutputs); > > - } > > - /* this moves screen to (0, 0) */ > > - ecore_x_randr_screen_reset(root); > > - /* release the server grab */ > > - ecore_x_ungrab(); > > -} > > - > > -static Eina_Bool > > -_e_randr_event_cb_screen_change(void *data EINA_UNUSED, int type > > EINA_UNUSED, void *event) -{ > > - Ecore_X_Event_Screen_Change *ev; > > - Eina_Bool changed = EINA_FALSE; > > - Ecore_X_Randr_Output primary = 0; > > - > > - ev = event; > > - > > - /* check if this event's root window is Our root window */ > > - if (ev->root != e_manager_current_get()->root) > > - return ECORE_CALLBACK_RENEW; > > - > > - primary = ecore_x_randr_primary_output_get(ev->root); > > - > > - if (e_randr_cfg->primary != primary) > > - { > > - e_randr_cfg->primary = primary; > > - changed = EINA_TRUE; > > - } > > - > > - if (e_randr_cfg->config_timestamp != ev->config_time) > > - { > > - e_randr_cfg->config_timestamp = ev->config_time; > > - changed = EINA_TRUE; > > - } > > - > > - if (changed) e_randr_config_save(); > > - > > - return ECORE_CALLBACK_RENEW; > > -} > > - > > -static Eina_Bool > > -_e_randr_event_cb_crtc_change(void *data EINA_UNUSED, int type > > EINA_UNUSED, void *event) -{ > > - Ecore_X_Event_Randr_Crtc_Change *ev; > > - E_Randr_Crtc *crtc; > > - > > - ev = event; > > - crtc = _e_randr_crtc_find(ev->crtc); > > - > > - if (!crtc) > > - { > > - crtc = E_NEW(E_Randr_Crtc, 1); > > - if (crtc) > > - { > > - e_randr->crtcs = eina_list_append(e_randr->crtcs, crtc); > > - crtc->xid = ev->crtc; > > - > > - crtc->geo = ev->geo; > > - crtc->mode = ev->mode; > > - crtc->orient = ev->orientation; > > - } > > - } > > - else > > - { > > - /* check (and update if needed) our crtc config */ > > - if ((ev->mode != crtc->mode) || > > - (ev->orientation != crtc->orient) || > > - (ev->geo.x != crtc->geo.x) || (ev->geo.y != crtc->geo.y) || > > - (ev->geo.w != crtc->geo.w) || (ev->geo.h != crtc->geo.h)) > > - { > > - crtc->mode = ev->mode; > > - crtc->orient = ev->orientation; > > - crtc->geo = ev->geo; > > - } > > - } > > - > > - return ECORE_CALLBACK_RENEW; > > -} > > - > > -static Eina_Bool > > -_e_randr_event_cb_output_change(void *data EINA_UNUSED, int type > > EINA_UNUSED, void *event) -{ > > - Ecore_X_Event_Randr_Output_Change *ev; > > - E_Randr_Output *output; > > - Eina_Bool changed = EINA_FALSE; > > - > > - ev = event; > > - > > - /* check if this event's root window is Our root window */ > > - if (ev->win != e_manager_current_get()->root) > > - return ECORE_CALLBACK_RENEW; > > - > > - /* loop our crtcs and try to find this output */ > > - output = _e_randr_output_find(ev->output); > > - if (!output) > > - { > > - Ecore_X_Window root; > > - > > - root = ecore_x_window_root_first_get(); > > - > > - output = E_NEW(E_Randr_Output, 1); > > - if (!output) goto error; > > - e_randr->outputs = eina_list_append(e_randr->outputs, output); > > - output->xid = ev->output; > > - output->name = _e_randr_output_name_get(root, output->xid); > > - output->is_lid = _e_randr_is_lid(output); > > - output->edid = _e_randr_output_edid_string_get(root, ev->output); > > - changed = EINA_TRUE; > > - output->cfg = _e_randr_config_output_find(output); > > - if (!output->cfg) > > - { > > - output->cfg = _e_randr_config_output_new(); > > - if (output->name) output->cfg->name = strdup(output->name); > > - if (output->edid) output->cfg->edid = strdup(output->edid); > > - } > > - } > > - output->status = ev->connection; > > - > > - /* we know this output */ > > - if (output->is_lid && _e_randr_lid_is_closed) > > - { > > - /* ignore event from disconnected lid */ > > - } > > - else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED) > > - { > > - Eina_Bool unknown = EINA_FALSE; > > - > > - if ((!output->crtc) || (output->crtc->xid == 0)) unknown = > > EINA_TRUE; - > > - /* connected */ > > - if ((ev->crtc != 0) && ((!unknown) && (output->crtc->xid != > > ev->crtc))) > > - { > > - /* remove from old crtc */ > > - _e_randr_output_active_set(output, EINA_FALSE); > > - } > > - if ((!output->active) && (output->cfg->connect)) > > - { > > - _e_randr_output_active_set(output, EINA_TRUE); > > - > > - if (output->crtc) > > - { > > - /* connect to crtc */ > > - /* get orientation from crtc if not set */ > > - if (!output->cfg->orient) > > - output->cfg->orient = output->crtc->orient; > > - /* validate output mode */ > > - _e_randr_output_mode_update(output); > > - /* if unknown position at far right */ > > - if (unknown) > > - { > > - E_Randr_Output *other; > > - Eina_List *l; > > - > > - EINA_LIST_FOREACH(e_randr->outputs, l, other) > > - { > > - if ((other == output) || (!output->active)) > > continue; > > - if ((other->cfg->geo.x + other->cfg->geo.w) > > > output->cfg->geo.x) > > - output->cfg->geo.x = other->cfg->geo.x + > > other->cfg->geo.w; > > - } > > - } > > - } > > - changed = EINA_TRUE; > > - } > > - } > > - else if (ev->connection == ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED) > > - { > > - /* disconnected */ > > - if (output->active) > > - { > > - _e_randr_output_active_set(output, EINA_FALSE); > > - changed = EINA_TRUE; > > - } > > - } > > - > > - /* save the config if anything changed or we added a new one */ > > - if (changed) > > - { > > - _e_randr_lid_update(); > > - _e_randr_config_primary_update(); > > - _e_randr_apply(); > > - > > - e_randr_config_save(); > > - } > > - > > - return ECORE_CALLBACK_RENEW; > > -error: > > - free(output); > > - return ECORE_CALLBACK_RENEW; > > -} > > - > > -static Eina_Bool > > -_e_randr_event_cb_acpi(void *data EINA_UNUSED, int type EINA_UNUSED, void > > *event) -{ > > - E_Event_Acpi *ev; > > - > > - ev = event; > > - > > - if (ev->type == E_ACPI_TYPE_LID) > > - { > > - Eina_Bool changed; > > - > > - _e_randr_lid_is_closed = (ev->status == E_ACPI_LID_CLOSED); > > - changed = _e_randr_lid_update(); > > - if (changed) > > - { > > - /* force new evaluation of primary */ > > - e_randr_cfg->primary = 0; > > - _e_randr_config_primary_update(); > > - _e_randr_apply(); > > - } > > - } > > - return ECORE_CALLBACK_RENEW; > > -} > > - > > -static void > > -_e_randr_output_mode_update(E_Randr_Output *output) > > -{ > > - Ecore_X_Window root = 0; > > - Ecore_X_Randr_Mode *modes = NULL; > > - int nmodes = 0, pref = 0; > > - Ecore_X_Randr_Mode_Info **mode_infos = NULL; > > - int nmode_infos = 0; > > - int i = 0; > > - > > - /* grab the root window */ > > - root = ecore_x_window_root_first_get(); > > - > > - printf("RR: ... 1 - %s\n", output->name); > > - /* get mode infos */ > > - mode_infos = ecore_x_randr_modes_info_get(root, &nmode_infos); > > - if (nmode_infos == 0) goto error; > > - printf("RR: ... 2\n"); > > - /* get the list of modes for this output */ > > - modes = ecore_x_randr_output_modes_get(root, output->xid, &nmodes, > > &pref); > > - if (nmodes == 0) goto error; > > - printf("RR: ... 3\n"); > > - > > - /* try to find the matching mode */ > > - output->mode = 0; > > - if ((output->cfg->geo.w != 0) && (output->cfg->geo.h != 0)) > > - { > > - printf("RR: ... 4\n"); > > - for (i = 0; i < nmode_infos; i++) > > - { > > - double rate = 0.0; > > - > > - rate = e_randr_mode_refresh_rate_get(mode_infos[i]); > > - printf("RR: ... 4.1 ... %i %1.3f cfg=%p modes=%p nmodes=%i > > \n", i, rate, output->cfg, modes, nmodes); > > - if ((mode_infos[i]->width == (unsigned > > int)output->cfg->geo.w) && > > - (mode_infos[i]->height == (unsigned > > int)output->cfg->geo.h) && > > - (dblequal(rate, output->cfg->refresh_rate)) && > > - (_e_randr_output_mode_valid(mode_infos[i]->xid, modes, > > nmodes))) > > - { > > - printf("RR: ... 4.2 - match %ix%i @ %2.3f\n", > > output->cfg->geo.w, output->cfg->geo.h, rate); > > - output->mode = mode_infos[i]->xid; > > - break; > > - } > > - printf("RR: ... 4.3\n"); > > - } > > - } > > - printf("RR: ... 5\n"); > > - > > - /* see if we can use the mode of the crtc */ > > - if ((!output->mode) && (output->crtc)) > > - { > > - E_Randr_Crtc *crtc; > > - > > - crtc = _e_randr_crtc_find(ecore_x_randr_output_crtc_get(root, > > output->xid)); > > - printf("RR: ... 6\n"); > > - if (crtc && crtc->mode) > > - { > > - printf("RR: ... 6.1\n"); > > - if (_e_randr_output_mode_valid(crtc->mode, modes, nmodes)) > > - output->mode = crtc->mode; > > - /* TODO: See if we have a mode of the same size with another > > mode id */ > > - } > > - } > > - printf("RR: ... 7\n"); > > - > > - /* set preferred mode */ > > - if (!output->mode) > > - { > > - printf("RR: ... 8\n"); > > - if (pref > 0) output->mode = modes[pref - 1]; > > - else output->mode = modes[0]; > > - } > > - > > - /* set width and height from mode */ > > - for (i = 0; i < nmode_infos; i++) > > - { > > - printf("RR: ... 9\n"); > > - if (mode_infos[i]->xid == output->mode) > > - { > > - output->cfg->geo.w = mode_infos[i]->width; > > - output->cfg->geo.h = mode_infos[i]->height; > > - output->cfg->refresh_rate = e_randr_mode_refresh_rate_get > > (mode_infos[i]); > > - printf("RR: ... 9.1 %ix%i @ %2.3f\n", output->cfg->geo.w, > > output->cfg->geo.h, output->cfg->refresh_rate); > > - break; > > - } > > - } > > - printf("RR: ... 10\n"); > > - > > - if (modes) free(modes); > > - if (mode_infos) > > - { > > - for (i = 0; i < nmode_infos; i++) free(mode_infos[i]); > > - free(mode_infos); > > - } > > - return; > > -error: > > - if (modes) free(modes); > > - if (mode_infos) > > - { > > - for (i = 0; i < nmode_infos; i++) > > - free(mode_infos[i]); > > - free(mode_infos); > > - } > > - output->cfg->geo.x = output->cfg->geo.y = output->cfg->geo.w = > > output->cfg->geo.h = 0; > > - output->cfg->refresh_rate = 0.0; > > - output->mode = 0; > > - return; > > -} > > - > > -static E_Config_Randr_Output * > > -_e_randr_config_output_new(void) > > -{ > > - E_Config_Randr_Output *cfg = NULL; > > - > > - if ((cfg = E_NEW(E_Config_Randr_Output, 1))) > > - { > > - /* all new outputs should connect automatically */ > > - /* TODO: config option */ > > - cfg->connect = EINA_TRUE; > > - > > - /* append this output config to randr config */ > > - e_randr_cfg->outputs = > > - eina_list_append(e_randr_cfg->outputs, cfg); > > - } > > - > > - return cfg; > > -} > > - > > -static E_Config_Randr_Output * > > -_e_randr_config_output_find(E_Randr_Output *output) > > -{ > > - Eina_List *l; > > - E_Config_Randr_Output *output_cfg; > > - char b1[4096], b2[4096]; > > - > > - /* TODO: We should not match outputs with unknown name and edid */ > > - snprintf(b1, sizeof(b1), "%s.%s", > > - output->name ? output->name : "???", > > - output->edid ? output->edid : "???"); > > - EINA_LIST_FOREACH(e_randr_cfg->outputs, l, output_cfg) > > - { > > - snprintf(b2, sizeof(b2), "%s.%s", > > - output_cfg->name ? output_cfg->name : "???", > > - output_cfg->edid ? output_cfg->edid : "???"); > > - if (!strcmp(b1, b2)) return output_cfg; > > - } > > - > > - return NULL; > > -} > > - > > -static E_Randr_Crtc * > > -_e_randr_crtc_find(Ecore_X_Randr_Crtc xid) > > -{ > > - Eina_List *l; > > - E_Randr_Crtc *crtc; > > - > > - EINA_LIST_FOREACH(e_randr->crtcs, l, crtc) > > - { > > - if (crtc->xid == xid) > > - return crtc; > > - } > > - > > - return NULL; > > -} > > - > > -static E_Randr_Output * > > -_e_randr_output_find(Ecore_X_Randr_Output xid) > > -{ > > - Eina_List *l; > > - E_Randr_Output *output; > > - > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - if (output->xid == xid) > > - return output; > > - } > > - > > - return NULL; > > -} > > - > > -static void > > -_e_randr_output_crtc_find(E_Randr_Output *output) > > -{ > > - Ecore_X_Window root = 0; > > - E_Randr_Crtc *crtc = NULL; > > - Ecore_X_Randr_Crtc *possible = NULL; > > - Ecore_X_Randr_Mode *modes = NULL; > > - Eina_List *l; > > - int num = 0, i = 0; > > - int nmodes, pref; > > - > > - /* grab the root window */ > > - root = ecore_x_window_root_first_get(); > > - > > - /* check if last is available */ > > - if ((crtc = _e_randr_crtc_find(ecore_x_randr_output_crtc_get(root, > > output->xid)))) > > - { > > - if (!crtc->outputs) > > - goto done; > > - } > > - > > - /* get a list of possible crtcs for this output */ > > - possible = ecore_x_randr_output_possible_crtcs_get(root, output->xid, > > &num); > > - if (num == 0) goto error; > > - > > - /* loop the possible crtcs */ > > - for (i = 0; i < num; i++) > > - { > > - if ((crtc = _e_randr_crtc_find(possible[i]))) > > - { > > - if (!crtc->outputs) > > - goto done; > > - } > > - } > > - > > - /* get the list of modes for this output */ > > - modes = ecore_x_randr_output_modes_get(root, output->xid, &nmodes, > > &pref); > > - if (nmodes == 0) > > - goto error; > > - > > - /* can we clone this output */ > > - for (i = 0; i < num; i++) > > - { > > - if ((crtc = _e_randr_crtc_find(possible[i]))) > > - { > > - /* check if mode is valid for this output */ > > - if (_e_randr_output_mode_valid(crtc->mode, modes, nmodes)) > > - goto done; > > - } > > - } > > - > > - /* last resort, just loop crtcs to find available */ > > - EINA_LIST_FOREACH(e_randr->crtcs, l, crtc) > > - { > > - if (!crtc->outputs) goto done; > > - crtc = NULL; > > - } > > - > > -error: > > - free(possible); > > - free(modes); > > - > > - output->crtc = NULL; > > - return; > > - > > -done: > > - free(possible); > > - free(modes); > > - > > - output->crtc = crtc; > > -} > > - > > -static void > > -_e_randr_config_mode_geometry(Ecore_X_Randr_Orientation orient, > > Eina_Rectangle *rect) -{ > > - int mw = 0, mh = 0; > > - > > - /* based on orientation, calculate mode sizes */ > > - switch (orient) > > - { > > - case ECORE_X_RANDR_ORIENTATION_ROT_0: > > - case ECORE_X_RANDR_ORIENTATION_ROT_180: > > - mw = rect->w; > > - mh = rect->h; > > - break; > > - case ECORE_X_RANDR_ORIENTATION_ROT_90: > > - case ECORE_X_RANDR_ORIENTATION_ROT_270: > > - mw = rect->h; > > - mh = rect->w; > > - break; > > - default: > > - break; > > - } > > - > > - rect->x = 0; > > - rect->y = 0; > > - rect->w = mw; > > - rect->h = mh; > > -} > > - > > -static void > > -_e_randr_config_primary_update(void) > > -{ > > - Ecore_X_Window root = 0; > > - Eina_List *l; > > - E_Randr_Output *output; > > - Ecore_X_Randr_Output primary = 0; > > - > > - /* check if we agree with system setup */ > > - root = ecore_x_window_root_first_get(); > > - primary = ecore_x_randr_primary_output_get(root); > > - /* see if our selected primary exists and is connected */ > > - output = _e_randr_output_find(e_randr_cfg->primary); > > - if ((!output) || (!output->active)) > > - e_randr_cfg->primary = 0; > > - > > - /* check if system primary is the same as ours */ > > - if ((primary > 0) && (primary == e_randr_cfg->primary)) return; > > - > > - if ((e_randr_cfg->primary > 0) && > > - output && output->active) > > - { > > - /* prefer our primary */ > > - ecore_x_randr_primary_output_set(root, e_randr_cfg->primary); > > - } > > - else > > - { > > - /* find lid */ > > - e_randr_cfg->primary = 0; > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - if (output->is_lid) > > - { > > - if (output->active) > > - e_randr_cfg->primary = output->xid; > > - break; > > - } > > - } > > - if (!e_randr_cfg->primary) > > - { > > - /* TODO: prefer top-left active monitor */ > > - /* no lid, use first existing */ > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - if (output->active) > > - { > > - e_randr_cfg->primary = output->xid; > > - break; > > - } > > - } > > - } > > - /* set primary */ > > - ecore_x_randr_primary_output_set(root, e_randr_cfg->primary); > > - } > > -} > > - > > -static void > > -_e_randr_acpi_handler_add(void *data EINA_UNUSED) > > -{ > > - E_LIST_HANDLER_APPEND(_randr_event_handlers, > > - E_EVENT_ACPI, > > - _e_randr_event_cb_acpi, NULL); > > -} > > - > > -static int > > -_e_randr_is_lid(E_Randr_Output *cfg) > > -{ > > - /* TODO: ecore_x_randr_output_connector_type_get */ > > - int ret = 0; > > - > > - if (!cfg->name) return 0; > > - if (strstr(cfg->name, "LVDS")) ret = 1; > > - else if (strstr(cfg->name, "lvds")) ret = 1; > > - else if (strstr(cfg->name, "Lvds")) ret = 1; > > - else if (strstr(cfg->name, "LCD")) ret = 1; > > - else if (strstr(cfg->name, "eDP")) ret = 1; > > - else if (strstr(cfg->name, "edp")) ret = 1; > > - else if (strstr(cfg->name, "EDP")) ret = 1; > > - return ret; > > -} > > - > > -static void > > -_e_randr_crtc_from_outputs_set(E_Randr_Crtc *crtc) > > -{ > > - E_Randr_Output *output; > > - Eina_List *l; > > - > > - EINA_LIST_FOREACH(crtc->outputs, l, output) > > - { > > - if (!output->active) continue; > > - /* TODO: If status != connected, active should not be set */ > > - if (output->status != ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED) > > - { > > - printf("RRR: Error, unconnected output which is active."); > > - printf(" output: '%s' lid: %i active: %i status: %i\n", > > - output->name, output->is_lid, output->active, > > output->status); > > - continue; > > - } > > - printf("RRR: output: '%s' lid: %i active: %i status: %i\n", > > output->name, output->is_lid, output->active, output->status); > > - /* TODO: Match all connected outputs, not only the first */ > > - crtc->mode = output->mode; > > - crtc->orient = output->cfg->orient; > > - crtc->geo = output->cfg->geo; > > - break; > > - } > > -} > > - > > -static Eina_Bool > > -_e_randr_lid_update(void) > > -{ > > - E_Randr_Output *output; > > - Eina_List *l; > > - Eina_Bool changed = EINA_FALSE; > > - int active_nonlid = 0; > > - > > - changed = EINA_FALSE; > > - /* Find all non-lids */ > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - if (output->is_lid) continue; > > - if (!output->active) continue; > > - active_nonlid++; > > - } > > - if (_e_randr_lid_is_closed && (active_nonlid > 0)) > > - { > > - /* Disable lids if closed and we have other monitors */ > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - Eina_Bool active; > > - > > - if (!output->is_lid) continue; > > - active = output->active; > > - _e_randr_output_active_set(output, EINA_FALSE); > > - if (active != output->active) changed = EINA_TRUE; > > - } > > - } > > - else > > - { > > - /* Enable lids */ > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - Eina_Bool active; > > - > > - if (!output->is_lid) continue; > > - if (output->cfg && output->cfg->connect) > > - { > > - active = output->active; > > - _e_randr_output_active_set(output, EINA_TRUE); > > - if (active != output->active) changed = EINA_TRUE; > > - } > > - } > > - } > > - > > - return changed; > > -} > > - > > -static Eina_Bool > > -_e_randr_output_mode_valid(Ecore_X_Randr_Mode mode, Ecore_X_Randr_Mode > > *modes, int nmodes) -{ > > - Eina_Bool valid = EINA_FALSE; > > - int i; > > - > > - for (i = 0; i < nmodes; i++) > > - { > > - if (modes[i] == mode) > > - { > > - valid = EINA_TRUE; > > - break; > > - } > > - } > > - return valid; > > -} > > - > > -static void > > -_e_randr_output_active_set(E_Randr_Output *output, Eina_Bool active) > > -{ > > - E_Randr_Crtc *crtc; > > - Eina_List *l; > > - > > - printf("RR: _e_randr_output_active_set... [%s] %i %i\n", output->name, > > output->active, active); > > - output->active = EINA_FALSE; > > - > > - /* Remove output from all crtcs */ > > - /* TODO: In theory the output should be only on one crtc, but to be > > sure... > > - * And we always do this be sure we have a good crtc */ > > - EINA_LIST_FOREACH(e_randr->crtcs, l, crtc) > > - { > > - crtc->outputs = > > - eina_list_remove(crtc->outputs, output); > > - } > > - output->crtc = NULL; > > - > > - if (active) > > - { > > - /* Find a crtc for the output */ > > - _e_randr_output_crtc_find(output); > > - if (output->crtc) > > - { > > - printf("RR: ... found crtc %i\n", active); > > - output->crtc->outputs = > > - eina_list_append(output->crtc->outputs, output); > > - output->active = EINA_TRUE; > > - } > > - } > > - printf("RR: _e_randr_output_active_set... done - %p\n", output->crtc); > > - > > - /* Track all active outputs */ > > - e_randr->active = 0; > > - EINA_LIST_FOREACH(e_randr->outputs, l, output) > > - { > > - if (output->active) e_randr->active++; > > - } > > -} > > - > > -static char * > > -_e_randr_output_name_get(Ecore_X_Window root, Ecore_X_Randr_Output output) > > -{ > > - char *name; > > - > > - name = ecore_x_randr_output_name_get(root, output, NULL); > > - if (!name) > > - { > > - > > - unsigned char *edid = NULL; > > - unsigned long edid_length = 0; > > - > > - /* get the edid for this output */ > > - if ((edid = > > - ecore_x_randr_output_edid_get(root, output, &edid_length))) > > - { > > - /* get output name */ > > - name = ecore_x_randr_edid_display_name_get(edid, edid_length); > > - > > - /* free any memory allocated from ecore_x_randr */ > > - free(edid); > > - } > > - } > > - return name; > > -} > > diff --git a/src/bin/e_randr.h b/src/bin/e_randr.h > > deleted file mode 100644 > > index 654a7e4..0000000 > > --- a/src/bin/e_randr.h > > +++ /dev/null > > @@ -1,88 +0,0 @@ > > -#ifdef E_TYPEDEFS > > - > > -typedef struct _E_Config_Randr_Output E_Config_Randr_Output; > > -typedef struct _E_Config_Randr E_Config_Randr; > > - > > -typedef struct _E_Randr_Output E_Randr_Output; > > -typedef struct _E_Randr_Crtc E_Randr_Crtc; > > -typedef struct _E_Randr E_Randr; > > - > > -#else > > -# ifndef E_RANDR_H > > -# define E_RANDR_H > > - > > -#define E_RANDR_VERSION_1_1 ((1 << 16) | 1) > > -#define E_RANDR_VERSION_1_2 ((1 << 16) | 2) > > -#define E_RANDR_VERSION_1_3 ((1 << 16) | 3) > > -#define E_RANDR_VERSION_1_4 ((1 << 16) | 4) > > - > > -#define E_RANDR_CONFIG_FILE_EPOCH 5 > > -#define E_RANDR_CONFIG_FILE_GENERATION 1 > > -#define E_RANDR_CONFIG_FILE_VERSION \ > > - ((E_RANDR_CONFIG_FILE_EPOCH * 1000000) + E_RANDR_CONFIG_FILE_GENERATION) > > - > > -struct _E_Config_Randr_Output > > -{ > > - const char *name; > > - const char *edid; > > - > > - unsigned int orient; // value of the ecore_x_randr_orientation > > - Eina_Rectangle geo; // geometry > > - double refresh_rate; // calculated refresh rate > > - Eina_Bool connect; // does the user want this output connected > > -}; > > - > > -struct _E_Config_Randr > > -{ > > - int version; // INTERNAL CONFIG VERSION > > - > > - Eina_List *outputs; > > - > > - unsigned char restore; > > - unsigned long config_timestamp; > > - unsigned int primary; > > -}; > > - > > -struct _E_Randr_Output > > -{ > > - unsigned int xid; // ecore_x_randr output id (xid) > > - unsigned int mode; // ecore_x_randr mode id (xid) > > - char *name; // name of output > > - char *edid; // edid as a hex string > > - Eina_Bool is_lid; // is this a laptop panel > > - Eina_Bool active; // if this output is active > > - Ecore_X_Randr_Connection_Status status; > > - > > - E_Config_Randr_Output *cfg; > > - E_Randr_Crtc *crtc; > > -}; > > - > > -struct _E_Randr_Crtc > > -{ > > - unsigned int xid; // ecore_x_randr output id (xid) > > - > > - Eina_Rectangle geo; // geometry > > - unsigned int orient; // value of the ecore_x_randr_orientation > > - unsigned int mode; // ecore_x_randr mode id (xid) > > - Eina_List *outputs; // list of outputs for this crtc > > -}; > > - > > -struct _E_Randr > > -{ > > - int active; // number of active outputs > > - Eina_List *crtcs; // list of crtcs > > - Eina_List *outputs; // list of outputs > > -}; > > - > > -EINTERN Eina_Bool e_randr_init(void); > > -EINTERN int e_randr_shutdown(void); > > - > > -EAPI Eina_Bool e_randr_config_save(void); > > -EAPI void e_randr_config_apply(void); > > -EAPI double e_randr_mode_refresh_rate_get(Ecore_X_Randr_Mode_Info > > *mode); - > > -extern EAPI E_Config_Randr *e_randr_cfg; > > -extern EAPI E_Randr *e_randr; > > - > > -# endif > > -#endif > > diff --git a/src/bin/e_widget.c b/src/bin/e_widget.c > > index 8d94ff8..4b72f9d 100644 > > --- a/src/bin/e_widget.c > > +++ b/src/bin/e_widget.c > > @@ -130,18 +130,13 @@ e_widget_data_get(Evas_Object *obj) > > EAPI void > > e_widget_size_min_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh) > > { > > - API_ENTRY return; > > - if (minw >= 0) sd->minw = minw; > > - if (minh >= 0) sd->minh = minh; > > evas_object_size_hint_min_set(obj, minw, minh); > > } > > > > EAPI void > > e_widget_size_min_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord > > *minh) { > > - API_ENTRY return; > > - if (minw) *minw = sd->minw; > > - if (minh) *minh = sd->minh; > > + evas_object_size_hint_min_get(obj, minw, minh); > > } > > > > static void > > @@ -508,8 +503,9 @@ e_widget_pointer_get(Evas_Object *obj) > > EAPI void > > e_widget_size_min_resize(Evas_Object *obj) > > { > > - API_ENTRY return; > > - evas_object_resize(obj, sd->minw, sd->minh); > > + Evas_Coord minw, minh; > > + evas_object_size_hint_min_get(obj, &minw, &minh); > > + evas_object_resize(obj, minw, minh); > > } > > > > /* local subsystem functions */ > > > > > > ------------------------------------------------------------------------------ > New Year. New Location. New Benefits. New Data Center in Ashburn, VA. > GigeNET is offering a free month of service with a new server in Ashburn. > Choose from 2 high performing configs, both with 100TB of bandwidth. > Higher redundancy.Lower latency.Increased capacity.Completely compliant. > http://p.sf.net/sfu/gigenet > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ New Year. New Location. New Benefits. New Data Center in Ashburn, VA. GigeNET is offering a free month of service with a new server in Ashburn. Choose from 2 high performing configs, both with 100TB of bandwidth. Higher redundancy.Lower latency.Increased capacity.Completely compliant. http://p.sf.net/sfu/gigenet _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel