enlightenment_my/src/modules/conf_window_manipulation/e_int_config_focus.c

364 lines
15 KiB
C
Raw Normal View History

#include "e.h"
/* PROTOTYPES - same all the time */
2013-02-06 01:11:53 -08:00
static void *_create_data(E_Config_Dialog *cfd);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _advanced_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _advanced_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static Evas_Object *_advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
/* Actual config data we will be playing with whil the dialog is active */
struct _E_Config_Dialog_Data
{
/*- BASIC -*/
2013-02-06 01:11:53 -08:00
int mode;
int use_auto_raise;
/*- ADVANCED -*/
2013-02-06 01:11:53 -08:00
int focus_policy;
int focus_setting;
int pass_click_on;
int window_activehint_policy;
int always_click_to_raise;
int always_click_to_focus;
int focus_last_focused_per_desktop;
int focus_revert_on_hide_or_close;
int pointer_slide;
int disable_all_pointer_warps;
double pointer_warp_speed;
double auto_raise_delay;
2013-02-06 01:11:53 -08:00
int border_raise_on_mouse_action;
};
/* a nice easy setup function that does the dirty work */
2010-01-22 12:28:39 -08:00
E_Config_Dialog *
2007-07-24 11:47:26 -07:00
e_int_config_focus(E_Container *con, const char *params __UNUSED__)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
2013-02-06 01:11:53 -08:00
if (e_config_dialog_find("E", "windows/window_focus")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
2013-02-06 01:11:53 -08:00
/* methods */
2013-02-06 01:11:53 -08:00
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->basic.apply_cfdata = _basic_apply;
v->basic.create_widgets = _basic_create;
v->basic.check_changed = _basic_check_changed;
v->advanced.apply_cfdata = _advanced_apply;
v->advanced.create_widgets = _advanced_create;
v->advanced.check_changed = _advanced_check_changed;
/* create config diaolg for NULL object/data */
2013-02-06 01:11:53 -08:00
cfd = e_config_dialog_new(con, _("Focus Settings"), "E",
"windows/window_focus", "preferences-focus",
0, v, NULL);
return cfd;
}
/**--CREATE--**/
static void
_fill_data(E_Config_Dialog_Data *cfdata)
{
cfdata->focus_policy = e_config->focus_policy;
cfdata->focus_setting = e_config->focus_setting;
cfdata->pass_click_on = e_config->pass_click_on;
cfdata->window_activehint_policy = e_config->window_activehint_policy;
cfdata->always_click_to_raise = e_config->always_click_to_raise;
cfdata->always_click_to_focus = e_config->always_click_to_focus;
2013-02-06 01:11:53 -08:00
cfdata->focus_last_focused_per_desktop =
e_config->focus_last_focused_per_desktop;
2013-02-06 01:11:53 -08:00
cfdata->focus_revert_on_hide_or_close =
e_config->focus_revert_on_hide_or_close;
cfdata->pointer_slide = e_config->pointer_slide;
cfdata->disable_all_pointer_warps = e_config->disable_all_pointer_warps;
cfdata->pointer_warp_speed = e_config->pointer_warp_speed;
cfdata->mode = cfdata->focus_policy;
cfdata->use_auto_raise = e_config->use_auto_raise;
cfdata->auto_raise_delay = e_config->auto_raise_delay;
2013-02-06 01:11:53 -08:00
cfdata->border_raise_on_mouse_action =
e_config->border_raise_on_mouse_action;
}
static void *
_create_data(E_Config_Dialog *cfd __UNUSED__)
{
/* Create cfdata - cfdata is a temporary block of config data that this
* dialog will be dealing with while configuring. it will be applied to
* the running systems/config in the apply methods
*/
E_Config_Dialog_Data *cfdata;
2013-02-06 01:11:53 -08:00
cfdata = E_NEW(E_Config_Dialog_Data, 1);
_fill_data(cfdata);
return cfdata;
}
static void
_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
free(cfdata);
}
/**--APPLY--**/
static int
_basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
/* Actually take our cfdata settings and apply them in real life */
e_border_button_bindings_ungrab_all();
if (cfdata->mode == E_FOCUS_CLICK)
{
2013-02-06 01:11:53 -08:00
e_config->focus_policy = E_FOCUS_CLICK;
e_config->focus_setting = E_FOCUS_NEW_WINDOW;
e_config->pass_click_on = 1;
e_config->window_activehint_policy = 2;
e_config->always_click_to_raise = 1;
e_config->always_click_to_focus = 1;
2013-02-06 01:11:53 -08:00
e_config->focus_last_focused_per_desktop = 1;
e_config->focus_revert_on_hide_or_close = 1;
e_config->pointer_slide = 0;
e_config->disable_all_pointer_warps = 1;
}
else if (cfdata->mode == E_FOCUS_MOUSE)
{
2013-02-06 01:11:53 -08:00
e_config->focus_policy = E_FOCUS_MOUSE;
e_config->focus_setting = E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED;
e_config->pass_click_on = 1;
e_config->window_activehint_policy = 2;
e_config->always_click_to_raise = 0;
e_config->always_click_to_focus = 0;
e_config->focus_last_focused_per_desktop = 0;
e_config->focus_revert_on_hide_or_close = 0;
e_config->pointer_slide = 1;
e_config->disable_all_pointer_warps = 0;
}
else
{
2013-02-06 01:11:53 -08:00
e_config->focus_policy = E_FOCUS_SLOPPY;
e_config->focus_setting = E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED;
e_config->pass_click_on = 1;
e_config->window_activehint_policy = 2;
e_config->always_click_to_raise = 0;
e_config->always_click_to_focus = 0;
e_config->focus_last_focused_per_desktop = 1;
e_config->focus_revert_on_hide_or_close = 1;
e_config->pointer_slide = 1;
e_config->disable_all_pointer_warps = 0;
}
e_config->use_auto_raise = cfdata->use_auto_raise;
e_border_button_bindings_grab_all();
e_config_save_queue();
return 1; /* Apply was OK */
}
static int
_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
2013-02-06 01:11:53 -08:00
return (e_config->focus_policy != cfdata->mode) ||
(e_config->use_auto_raise != cfdata->use_auto_raise);
}
static int
_advanced_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
/* Actually take our cfdata settings and apply them in real life */
e_border_button_bindings_ungrab_all();
e_config->focus_policy = cfdata->focus_policy;
e_config->focus_setting = cfdata->focus_setting;
e_config->pass_click_on = cfdata->pass_click_on;
e_config->window_activehint_policy = cfdata->window_activehint_policy;
e_config->always_click_to_raise = cfdata->always_click_to_raise;
e_config->always_click_to_focus = cfdata->always_click_to_focus;
2013-02-06 01:11:53 -08:00
e_config->focus_last_focused_per_desktop =
cfdata->focus_last_focused_per_desktop;
2013-02-06 01:11:53 -08:00
e_config->focus_revert_on_hide_or_close =
cfdata->focus_revert_on_hide_or_close;
e_config->pointer_slide = cfdata->pointer_slide;
e_config->disable_all_pointer_warps = cfdata->disable_all_pointer_warps;
e_config->pointer_warp_speed = cfdata->pointer_warp_speed;
e_config->use_auto_raise = cfdata->use_auto_raise;
e_config->auto_raise_delay = cfdata->auto_raise_delay;
e_config->border_raise_on_mouse_action = cfdata->border_raise_on_mouse_action;
e_border_button_bindings_grab_all();
e_config_save_queue();
return 1; /* Apply was OK */
}
static int
_advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
2013-02-06 01:11:53 -08:00
return (e_config->focus_policy != cfdata->focus_policy) ||
(e_config->focus_setting != cfdata->focus_setting) ||
(e_config->pass_click_on != cfdata->pass_click_on) ||
(e_config->window_activehint_policy != cfdata->window_activehint_policy) ||
(e_config->always_click_to_raise != cfdata->always_click_to_raise) ||
(e_config->always_click_to_focus != cfdata->always_click_to_focus) ||
(e_config->focus_last_focused_per_desktop != cfdata->focus_last_focused_per_desktop) ||
(e_config->focus_revert_on_hide_or_close != cfdata->focus_revert_on_hide_or_close) ||
(e_config->pointer_slide != cfdata->pointer_slide) ||
(e_config->disable_all_pointer_warps != cfdata->disable_all_pointer_warps) ||
(fabs(e_config->pointer_warp_speed - cfdata->pointer_warp_speed) < DBL_EPSILON) ||
(e_config->use_auto_raise != cfdata->use_auto_raise) ||
(e_config->auto_raise_delay != cfdata->auto_raise_delay) ||
remove "border_raise_on_focus" config option buckle up. for the first time in history, a config option is getting removed instead of added. the reasons for this removal are many, but let's go way back to the beginning and see why it was added: oh wait, we can't because the commit message (from 2006) is >> patches that i said were in - commit. (see my reply emails) >> also finish off a TODO item or 2 reading through the TODO items which were also crossed off in that commit, I'm assuming that this was the "option to NOT raise on focus in click to focus" item. == REASON 1 == the problem here is that there's another, BETTER option called "click raises window" (always_click_to_raise) which does the same thing, except it doesn't totally fuck you when you get a random X focus event, which happens more often than you might think. this means that, to avoid broken behavior which might cause your windows to spastically raise for a few frames in common cases (using winlist...) with click-to-focus, you have to know that this is the default-enabled option that's fucking you, and you have to remember to manually disable it every time. if you DON'T know that this is the option that's fucking you, and you just see windows randomly raising on their own, you'll probably either ignore it or file a bug, when this is supposed to be a "feature" that actually worked in reverse, since it was intended only for disabling. == REASON 2 == there's also auto-raise, which can be set to 0.0s, which is effectively the same thing since it also triggers on focus but can be configured not to fuck your window stack == REASON 3 == aaand finally, this option makes any sort of pointer focus model impossible to use, since your windows will constantly be raising all over as you move the mouse tl;dr: I'm removing it, e-dealwithit.gif
2013-10-06 22:49:33 -07:00
(e_config->border_raise_on_mouse_action != cfdata->border_raise_on_mouse_action);
}
/**--GUI--**/
static Evas_Object *
_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
{
/* generate the core widget layout for a basic dialog */
Evas_Object *o, *ob;
E_Radio_Group *rg;
o = e_widget_list_add(evas, 0, 0);
rg = e_widget_radio_group_new(&(cfdata->mode));
ob = e_widget_radio_add(evas, _("Click Window to Focus"), E_FOCUS_CLICK, rg);
e_widget_list_object_append(o, ob, 1, 0, 0.0);
ob = e_widget_radio_add(evas, _("Window under the Mouse"), E_FOCUS_MOUSE, rg);
e_widget_list_object_append(o, ob, 1, 0, 0.0);
2013-02-06 01:11:53 -08:00
ob = e_widget_radio_add(evas, _("Most recent Window under the Mouse"),
E_FOCUS_SLOPPY, rg);
e_widget_list_object_append(o, ob, 1, 0, 0.0);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Raise windows on mouse over"),
&(cfdata->use_auto_raise));
e_widget_list_object_append(o, ob, 1, 0, 0.5);
return o;
}
static Evas_Object *
_advanced_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
{
/* generate the core widget layout for an advanced dialog */
Evas_Object *otb, *ol, *ob, *obp, *of;
Evas_Object *autoraise_check;
E_Radio_Group *rg;
otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
/* Focus */
ol = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Focus Policy"), 0);
rg = e_widget_radio_group_new(&(cfdata->focus_policy));
ob = e_widget_radio_add(evas, _("Click"), E_FOCUS_CLICK, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Pointer"), E_FOCUS_MOUSE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Sloppy"), E_FOCUS_SLOPPY, rg);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
of = e_widget_framelist_add(evas, _("New Window Focus"), 0);
rg = e_widget_radio_group_new(&(cfdata->focus_setting));
ob = e_widget_radio_add(evas, _("No window"), E_FOCUS_NONE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("All windows"), E_FOCUS_NEW_WINDOW, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Only dialogs"), E_FOCUS_NEW_DIALOG, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Only dialogs with focused parent"),
E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED, rg);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
2013-02-06 01:11:53 -08:00
e_widget_toolbook_page_append(otb, NULL, _("Focus"), ol,
1, 0, 1, 0, 0.5, 0.0);
/* Stacking */
ol = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Autoraise"), 0);
2013-02-06 01:11:53 -08:00
autoraise_check = e_widget_check_add(evas, _("Raise windows on mouse over"),
&(cfdata->use_auto_raise));
e_widget_framelist_object_append(of, autoraise_check);
ob = e_widget_label_add(evas, _("Delay before raising:"));
e_widget_check_widget_disable_on_unchecked_add(autoraise_check, ob);
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_slider_add(evas, 1, 0, _("%1.1f s"), 0.0, 9.9, 0.1, 0,
&(cfdata->auto_raise_delay), NULL, 100);
e_widget_check_widget_disable_on_unchecked_add(autoraise_check, ob);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
of = e_widget_framelist_add(evas, _("Raise Window"), 0);
e_widget_framelist_content_align_set(of, 0.0, 0.0);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Raise when starting to move or resize"),
&(cfdata->border_raise_on_mouse_action));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
2013-02-06 01:11:53 -08:00
e_widget_toolbook_page_append(otb, NULL, _("Stacking"), ol,
1, 0, 1, 0, 0.5, 0.0);
/* Urgency */
of = e_widget_framelist_add(evas, _("Active Window Hint Policy"), 0);
rg = e_widget_radio_group_new(&cfdata->window_activehint_policy);
ob = e_widget_radio_add(evas, _("Ignore hint"), E_ACTIVEHINT_POLICY_IGNORE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Animate on hint"), E_ACTIVEHINT_POLICY_ANIMATE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Activate on hint"), E_ACTIVEHINT_POLICY_ACTIVATE, rg);
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
e_widget_toolbook_page_append(otb, NULL, _("Hints"), of,
1, 0, 1, 0, 0.5, 0.0);
/* Pointer */
ol = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Warping"), 0);
/* NOTE/TODO:
*
* IMHO all these slide-pointer-to-window, warp and all should have
* an unique and consistent setting. In some cases it just do not
* make sense to have one but not the other.
*/
2013-02-06 01:11:53 -08:00
obp = ob = e_widget_check_add(evas, _("Prevent all forms of pointer warping"),
&(cfdata->disable_all_pointer_warps));
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Slide pointer to a new window which is focused"),
&(cfdata->pointer_slide));
e_widget_framelist_object_append(of, ob);
e_widget_check_widget_disable_on_checked_add(obp, ob);
ob = e_widget_label_add(evas, _("Warp speed"));
e_widget_check_widget_disable_on_checked_add(obp, ob);
e_widget_framelist_object_append(of, ob);
ob = e_widget_slider_add(evas, 1, 0, _("%1.2f"), 0.0, 1.0, 0.01, 0,
&(cfdata->pointer_warp_speed), NULL, 100);
e_widget_check_widget_disable_on_checked_add(obp, ob);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
2013-02-06 01:11:53 -08:00
e_widget_toolbook_page_append(otb, NULL, _("Pointer"), ol,
1, 0, 1, 0, 0.5, 0.0);
/* Misc */
ol = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Other Settings"), 0);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Always pass click events to programs"),
&(cfdata->pass_click_on));
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Click raises the window"),
&(cfdata->always_click_to_raise));
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Click focuses the window"),
&(cfdata->always_click_to_focus));
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Refocus last window on desktop switch"),
&(cfdata->focus_last_focused_per_desktop));
e_widget_framelist_object_append(of, ob);
2013-02-06 01:11:53 -08:00
ob = e_widget_check_add(evas, _("Focus last focused window on lost focus"),
&(cfdata->focus_revert_on_hide_or_close));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
2013-02-06 01:11:53 -08:00
e_widget_toolbook_page_append(otb, NULL, _("Miscellaneous"), ol,
1, 0, 1, 0, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);
return otb;
}
2013-02-06 01:11:53 -08:00