enlightenment/src/modules/conf_randr/e_int_config_randr_policy.c

341 lines
14 KiB
C

#include "e_int_config_randr.h"
#include "e_randr.h"
#ifndef ECORE_X_RANDR_1_2
#define ECORE_X_RANDR_1_2 ((1 << 16) | 2)
#endif
#ifndef ECORE_X_RANDR_1_3
#define ECORE_X_RANDR_1_3 ((1 << 16) | 3)
#endif
#ifndef Ecore_X_Randr_Unset
#define Ecore_X_Randr_Unset -1
#endif
#define E_RANDR_12 (e_randr_screen_info.rrvd_info.randr_info_12)
static void _policy_widget_mouse_up_cb(void *data, Evas_Object *obj, void *event_info);
extern E_Config_Dialog_Data *e_config_runtime_info;
extern char _theme_file_path[];
static const char *_POLICIES_STRINGS[] = {
"ABOVE",
"RIGHT",
"BELOW",
"LEFT",
"CLONE",
"NONE",
"ASK"};
Eina_Bool
policy_widget_create_data(E_Config_Dialog_Data *data)
{
E_Config_Randr_Dialog_Output_Dialog_Data *odd;
E_Randr_Output_Info *oi = NULL;
Eina_List *iter;
if (!data || !data->output_dialog_data_list) return EINA_FALSE;
EINA_LIST_FOREACH(data->output_dialog_data_list, iter, odd)
{
if (odd->crtc)
oi = eina_list_data_get(odd->crtc->outputs);
else
oi = odd->output;
odd->previous_policy = oi ? oi->policy : (Ecore_X_Randr_Orientation) Ecore_X_Randr_Unset;
odd->new_policy = Ecore_X_Randr_Unset;
if (!oi) //Not of interest for dbg output
continue;
fprintf(stderr, "CONF_RANDR: Read in policy of %d as %s.\n", oi->xid, ((odd->previous_policy != (Ecore_X_Randr_Output_Policy) Ecore_X_Randr_Unset) ? _POLICIES_STRINGS[odd->previous_policy - 1] : "unset"));
}
return EINA_TRUE;
}
void
policy_widget_free_cfdata(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__)
{
}
Evas_Object *
policy_widget_basic_create_widgets(Evas *canvas)
{
Evas_Object *widget, *ro;
E_Radio_Group *rg;
//char signal[29];
if (!canvas || !e_config_runtime_info) return NULL;
if (e_config_runtime_info->gui.widgets.policy.widget) return e_config_runtime_info->gui.widgets.policy.widget;
if (!(widget = e_widget_framelist_add(canvas, _("Screen attachement policy"), EINA_FALSE))) return NULL;
// Add radio buttons
if (!(rg = e_widget_radio_group_new(&e_config_runtime_info->gui.widgets.policy.radio_val))) goto _policy_widget_radio_add_fail;
//IMPROVABLE: use enum to determine objects via 'switch'-statement
ro = e_widget_radio_add(canvas, _("Ask"), ECORE_X_RANDR_OUTPUT_POLICY_ASK, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_ask = ro;
ro = e_widget_radio_add(canvas, _("Above"), ECORE_X_RANDR_OUTPUT_POLICY_ABOVE, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_above = ro;
ro = e_widget_radio_add(canvas, _("Right"), ECORE_X_RANDR_OUTPUT_POLICY_RIGHT, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_right = ro;
ro = e_widget_radio_add(canvas, _("Below"), ECORE_X_RANDR_OUTPUT_POLICY_BELOW, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_below = ro;
ro = e_widget_radio_add(canvas, _("Left"), ECORE_X_RANDR_OUTPUT_POLICY_LEFT, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_left = ro;
ro = e_widget_radio_add(canvas, _("Clone display content"), ECORE_X_RANDR_OUTPUT_POLICY_CLONE, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_clone = ro;
ro = e_widget_radio_add(canvas, _("No reaction"), ECORE_X_RANDR_OUTPUT_POLICY_NONE, rg);
evas_object_smart_callback_add(ro, "changed", _policy_widget_mouse_up_cb, NULL);
e_widget_framelist_object_append(widget, ro);
e_config_runtime_info->gui.widgets.policy.radio_none = ro;
/*
// Add policies demonstration edje
if (!(e_config_runtime_info->gui.widgets.policy.swallowing_edje = edje_object_add(canvas)))
{
goto _policy_widget_edje_add_fail;
}
if (!edje_object_file_set(e_config_runtime_info->gui.widgets.policy.swallowing_edje, _theme_file_path, "e/conf/randr/dialog/widget/policies"))
{
goto _policy_widget_edje_set_fail;
}
e_widget_table_object_align_append(widget, e_config_runtime_info->gui.widgets.policy.swallowing_edje, 1, 0, 1, 1, 1, 1, 1, 1, 1.0, 1.0);
*/
/*
evas_object_show(e_config_runtime_info->gui.widgets.policy.swallowing_edje);
//emit signal to edje so a demonstration can be shown
snprintf(signal, sizeof(signal), "conf,randr,dialog,policies,%d", e_randr_screen_info->rrvd_info.randr_info_12->output_policy);
edje_object_signal_emit(e_config_runtime_info->gui.widgets.policy.swallowing_edje, signal, "e");
fprintf(stderr, "CONF_RANDR: Initial signal emitted to policy dialog: %s\n", signal);
//Use theme's background as screen representation
e_config_runtime_info->gui.widgets.policy.new_display = edje_object_add(canvas);
e_theme_edje_object_set(e_config_runtime_info->gui.widgets.policy.new_display, "base/theme/widgets", "e/widgets/frame");
e_config_runtime_info->gui.widgets.policy.new_display_background = edje_object_add(canvas);
e_theme_edje_object_set(e_config_runtime_info->gui.widgets.policy.new_display_background, "base/theme/background", "e/desktop/background");
edje_object_part_swallow(e_config_runtime_info->gui.widgets.policy.new_display, "e.swallow.content", e_config_runtime_info->gui.widgets.policy.new_display_background);
edje_object_part_text_set(e_config_runtime_info->gui.widgets.policy.new_display, "e.text.label", _("New display"));
edje_object_part_swallow(e_config_runtime_info->gui.widgets.policy.swallowing_edje, "new_display.swallow.content", e_config_runtime_info->gui.widgets.policy.new_display);
//add theme's frame
//for now use the theme's background for the new display as well
e_config_runtime_info->gui.widgets.policy.current_displays_setup = edje_object_add(canvas);
e_theme_edje_object_set(e_config_runtime_info->gui.widgets.policy.current_displays_setup, "base/theme/widgets", "e/widgets/frame");
e_config_runtime_info->gui.widgets.policy.current_displays_setup_background = edje_object_add(canvas);
e_theme_edje_object_set(e_config_runtime_info->gui.widgets.policy.current_displays_setup_background, "base/theme/background", "e/desktop/background");
edje_object_part_swallow(e_config_runtime_info->gui.widgets.policy.current_displays_setup, "e.swallow.content", e_config_runtime_info->gui.widgets.policy.current_displays_setup_background);
edje_object_part_text_set(e_config_runtime_info->gui.widgets.policy.current_displays_setup, "e.text.label", _("Used display"));
edje_object_part_swallow(e_config_runtime_info->gui.widgets.policy.swallowing_edje, "current_displays_setup.swallow.content", e_config_runtime_info->gui.widgets.policy.current_displays_setup);
*/
evas_object_show(widget);
return widget;
/*
_policy_widget_edje_set_fail:
evas_object_del(e_config_runtime_info->gui.widgets.policy.swallowing_edje);
_policy_widget_edje_add_fail:
fprintf(stderr, "CONF_RANDR: Couldn't set edj for policies widget!\n");
evas_object_del(widget);
return NULL;
*/
_policy_widget_radio_add_fail:
evas_object_del(widget);
return NULL;
}
static void
_policy_widget_mouse_up_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
//char signal[29];
if (!e_config_runtime_info->gui.selected_output_dd)
return;
e_config_runtime_info->gui.selected_output_dd->new_policy = e_config_runtime_info->gui.widgets.policy.radio_val;
/*
* The current dialog does not demonstrate what the policies mean, so disabled
* for now.
*
* snprintf(signal, sizeof(signal), "conf,randr,dialog,policies,%d", e_config_runtime_info->gui.widgets.policy.radio_val);
//edje_object_signal_emit(e_config_runtime_info->gui.widgets.policy.swallowing_edje, signal, "e");
fprintf(stderr, "CONF_RANDR: mouse button released. Emitted signal to policy: %s\n", signal);
*/
}
Eina_Bool
policy_widget_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
E_Config_Randr_Dialog_Output_Dialog_Data *odd;
Eina_List *it, *it2;
E_Randr_Output_Info *oi = NULL;
if (!E_RANDR_12 || !cfdata->output_dialog_data_list) return EINA_FALSE;
EINA_LIST_FOREACH(cfdata->output_dialog_data_list, it, odd)
{
if (odd->new_policy == (Ecore_X_Randr_Output_Policy) Ecore_X_Randr_Unset)
continue;
if (odd->crtc)
{
EINA_LIST_FOREACH(odd->crtc->outputs, it2, oi)
{
oi->policy = odd->new_policy;
fprintf(stderr, "CONF_RANDR: 'New display attached'-policy for output %d set to %s.\n", odd->output ? odd->output->xid : 0, _POLICIES_STRINGS[odd->new_policy - 1]);
}
}
else if (odd->output)
{
odd->output->policy = odd->new_policy;
fprintf(stderr, "CONF_RANDR: 'New display attached'-policy for output %d set to %s.\n", odd->output->xid, _POLICIES_STRINGS[odd->new_policy - 1]);
}
}
return EINA_TRUE;
}
Eina_Bool
policy_widget_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
E_Config_Randr_Dialog_Output_Dialog_Data *odd;
Eina_List *it;
if (!E_RANDR_12 || !cfdata->output_dialog_data_list) return EINA_FALSE;
EINA_LIST_FOREACH(cfdata->output_dialog_data_list, it, odd)
{
if ((odd->new_policy == (Ecore_X_Randr_Output_Policy) Ecore_X_Randr_Unset) ||
(odd->previous_policy == (Ecore_X_Randr_Output_Policy) Ecore_X_Randr_Unset))
continue;
if (odd->new_policy != odd->previous_policy)
return EINA_TRUE;
}
return EINA_FALSE;
}
void
policy_widget_update_radio_buttons(E_Config_Randr_Dialog_Output_Dialog_Data *odd)
{
Ecore_X_Randr_Output_Policy policy;
Eina_Bool enable = !odd;
//disable widgets, if no rep is selected
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_ask, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_above, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_right, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_below, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_left, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_clone, enable);
e_widget_disabled_set(e_config_runtime_info->gui.widgets.policy.radio_none, enable);
if (!odd) return;
policy = (odd->new_policy != (Ecore_X_Randr_Output_Policy) Ecore_X_Randr_Unset) ? odd->new_policy : odd->previous_policy;
//toggle the switch of the currently used policies
switch (policy)
{
case ECORE_X_RANDR_OUTPUT_POLICY_ASK:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_ask, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_right, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_below, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_left, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_clone, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_none, EINA_TRUE);
break;
case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
e_widget_radio_toggle_set(e_config_runtime_info->gui.widgets.policy.radio_above, EINA_TRUE);
break;
default:
break;
}
}
void
policy_widget_keep_changes(E_Config_Dialog_Data *cfdata)
{
E_Config_Randr_Dialog_Output_Dialog_Data *odd;
Eina_List *it;
if (!E_RANDR_12 || !cfdata->output_dialog_data_list)
return;
EINA_LIST_FOREACH(cfdata->output_dialog_data_list, it, odd)
{
odd->previous_policy = odd->new_policy;
odd->new_policy = Ecore_X_Randr_Unset;
}
}
void
policy_widget_discard_changes(E_Config_Dialog_Data *cfdata)
{
E_Config_Randr_Dialog_Output_Dialog_Data *odd;
Eina_List *it, *it2;
E_Randr_Output_Info *oi = NULL;
if (!E_RANDR_12 || !cfdata->output_dialog_data_list)
return;
EINA_LIST_FOREACH(cfdata->output_dialog_data_list, it, odd)
{
if (odd->crtc)
{
EINA_LIST_FOREACH(odd->crtc->outputs, it2, oi)
{
oi->policy = odd->previous_policy;
fprintf(stderr, "CONF_RANDR: 'New display attached'-policy for output %d restored to %s.\n", oi->xid, _POLICIES_STRINGS[odd->previous_policy - 1]);
}
}
else if (odd->output)
{
odd->output->policy = odd->previous_policy;
fprintf(stderr, "CONF_RANDR: 'New display attached'-policy for output %d restored to %s.\n", odd->output->xid, _POLICIES_STRINGS[odd->previous_policy - 1]);
}
}
return;
}