E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
if (bd->visible) return;
#ifdef _F_ZONE_WINDOW_ROTATION_
+ // newly created window that has to be rotated will be show after rotation done.
+ // so, skip at this time. it will be called again after GETTING ROT_DONE.
if ((bd->new_client) &&
(bd->client.e.state.rot.changes != -1))
{
- // newly created window that has to be rotated will be show after rotation done.
- // so, skip at this time. it will be called again after GETTING ROT_DONE.
+ // if this window is in withdrawn state, show this window right now.
+ // that's because the window in withdrawn state can't render its canvas.
+ // eventually, this window will not send the message of rotation done,
+ // even if e17 request to rotation this window.
+ if (bd->client.icccm.state != ECORE_X_WINDOW_STATE_HINT_NORMAL)
+ e_hints_window_visible_set(bd);
+
bd->client.e.state.rot.pending_show = 1;
return;
}
return EINA_FALSE;
}
+static Eina_Bool
+_e_border_rotation_change_floating_pos(E_Border *bd, int *x, int *y)
+{
+ int new_x, new_y;
+ int min_title_width=96;
+
+ if (!bd) return EINA_FALSE;
+ if (!x || !y) return EINA_FALSE;
+
+ new_x = bd->x;
+ new_y = bd->y;
+
+ // Portrait -> Landscape, x= pre_x*2, y=pre_y/2
+ // Landscape -> Portrait, x= pre_x/2, y=pre_y*2
+ // guaranteeing the minimum size of titlebar shown, min_title_width
+ // so user can initiate drag&drop action after rotation changed.
+ if (bd->client.e.state.rot.curr == 0)
+ {
+ if (bd->client.e.state.rot.prev == 90)
+ {
+ new_x = (bd->zone->h - bd->h - bd->y) / 2;
+ new_y = 2 * bd->x;
+ }
+ else if (bd->client.e.state.rot.prev == 270)
+ {
+ new_x = bd->y / 2;
+ new_y = (bd->zone->w - bd->w - bd->x) * 2;
+ }
+ else if (bd->client.e.state.rot.prev == 180)
+ {
+ new_x = bd->zone->w - bd->x - bd->w;
+ new_y = bd->zone->h - bd->y - bd->h;
+ }
+
+ if(new_x + bd->w < min_title_width)
+ {
+ new_x = min_title_width - bd->w;
+ }
+ else if(new_x > bd->zone->w - min_title_width)
+ {
+ new_x = bd->zone->w - min_title_width;
+ }
+ }
+ else if (bd->client.e.state.rot.curr == 90)
+ {
+ if (bd->client.e.state.rot.prev == 0)
+ {
+ new_x = bd->y / 2;
+ new_y = bd->zone->h - (2 * bd->x) - bd->w;
+ }
+ else if (bd->client.e.state.rot.prev == 270)
+ {
+ new_x = bd->zone->w - bd->x - bd->w;
+ new_y = bd->zone->h - bd->y - bd->h;
+ }
+ else if (bd->client.e.state.rot.prev == 180)
+ {
+ new_x = (bd->zone->h - bd->y - bd->h) / 2;
+ new_y = bd->zone->h - (2 * (bd->zone->w - bd->x - bd->w)) - bd->w;
+ }
+
+ if(new_y > bd->zone->h - min_title_width)
+ {
+ new_y = bd->zone->h - min_title_width;
+ }
+ else if(new_y < min_title_width - bd->w)
+ {
+ new_y = min_title_width - bd->w;
+ }
+ }
+ else if (bd->client.e.state.rot.curr == 270)
+ {
+ if (bd->client.e.state.rot.prev == 0)
+ {
+ new_x = bd->zone->w - bd->h - (bd->y / 2);
+ new_y = bd->x * 2;
+ }
+ else if (bd->client.e.state.rot.prev == 90)
+ {
+ new_x = bd->zone->w - bd->x - bd->w;
+ new_y = bd->zone->h - bd->y - bd->h;
+ }
+ else if (bd->client.e.state.rot.prev == 180)
+ {
+ new_x = bd->zone->w - bd->x - bd->w;
+ new_y = bd->zone->h - bd->y - bd->h;
+
+ new_x = bd->zone->w - bd->h - ((bd->zone->h - bd->y - bd->h) / 2);
+ new_y = (bd->zone->w - bd->x - bd->w) * 2;
+ }
+
+ if(new_y > bd->zone->h - min_title_width)
+ {
+ new_y = bd->zone->h - min_title_width;
+ }
+ else if( new_y + bd->w < min_title_width)
+ {
+ new_y = min_title_width - bd->w ;
+ }
+ }
+ else if (bd->client.e.state.rot.curr == 180)
+ {
+ if (bd->client.e.state.rot.prev == 0)
+ {
+ new_x = bd->zone->w - bd->x - bd->w;
+ new_y = bd->zone->h - bd->y - bd->h;
+ }
+ else if (bd->client.e.state.rot.prev == 90)
+ {
+ new_x = bd->zone->w - ((bd->zone->h - bd->h - bd->y) / 2) - bd->h;
+ new_y = bd->zone->h - (2 * bd->x) - bd->w;
+ }
+ else if (bd->client.e.state.rot.prev == 270)
+ {
+ new_x = bd->zone->w - (bd->y / 2) - bd->h;
+ new_y = bd->zone->h - ((bd->zone->w - bd->w - bd->x) * 2) - bd->w;
+ }
+
+ if(new_x + bd->w < min_title_width)
+ {
+ new_x = min_title_width - bd->w;
+ }
+ else if(new_x > bd->zone->w - min_title_width)
+ {
+ new_x = bd->zone->w - min_title_width;
+ }
+ }
+
+ ELBF(ELBT_ROT, 0, bd->client.win,
+ "Floating Mode. ANGLE (%d->%d), POS (%d,%d) -> (%d,%d)",
+ bd->client.e.state.rot.prev, bd->client.e.state.rot.curr,
+ bd->x, bd->y, new_x, new_y);
+
+ if ((new_x == *x) &&
+ (new_y == *y))
+ {
+ return EINA_FALSE;
+ }
+
+ *x = new_x;
+ *y = new_y;
+
+ return EINA_TRUE;
+}
+
#define SIZE_EQUAL_TO_ZONE(a, z) \
((((a)->w) == ((z)->w)) && \
(((a)->h) == ((z)->h)))
_x = bd->x; _y = bd->y;
_w = bd->w; _h = bd->h;
+ if (bd->client.illume.win_state.state == ECORE_X_ILLUME_WINDOW_STATE_FLOATING)
+ move = _e_border_rotation_change_floating_pos(bd, &_x, &_y);
+ else
+ move = EINA_FALSE;
+
rot_dif = bd->client.e.state.rot.prev - rotation;
if (rot_dif < 0) rot_dif = -rot_dif;
if (rot_dif != 180)
}
}
+
+ if (!resize && move)
+ _e_border_move_internal(bd, _x, _y, EINA_TRUE);
}
if (resize)
static int
_e_border_resize_begin(E_Border *bd)
{
+ int ret;
+
if (!bd->lock_user_stacking)
{
if (e_config->border_raise_on_mouse_action)
(bd->fullscreen) || (bd->lock_user_size))
return 0;
- if (grabbed && !e_grabinput_get(bd->win, 0, bd->win))
+ if (bd->client.icccm.accepts_focus || bd->client.icccm.take_focus)
+ ret = e_grabinput_get(bd->win, 0, bd->win);
+ else
+ ret = e_grabinput_get(bd->win, 0, 0);
+
+ if (grabbed && !ret)
{
grabbed = 0;
return 0;
static int
_e_border_move_begin(E_Border *bd)
{
+ int ret;
if (!bd->lock_user_stacking)
{
if (e_config->border_raise_on_mouse_action)
if ((bd->fullscreen) || (bd->lock_user_location))
return 0;
- if (grabbed && !e_grabinput_get(bd->win, 0, bd->win))
+ if (bd->client.icccm.accepts_focus || bd->client.icccm.take_focus)
+ ret = e_grabinput_get(bd->win, 0, bd->win);
+ else
+ ret = e_grabinput_get(bd->win, 0, 0);
+
+ if (grabbed && !ret)
{
grabbed = 0;
return 0;
#define ELBT_ILLUME 0x00000010
#define ELBT_COMP 0x00000020
#define ELBT_MOVE 0x00000040
+#define ELBT_TRACE 0x00000080
#define ELBT_ALL 0xFFFFFFFF
extern EAPI unsigned int e_logbuf_type;
#define ELB(t, s, i) do { if ((e_logbuf_type) & (t)) { e_logbuf_add((t), __FUNCTION__, __LINE__, (s), (i)); } } while (0);
#define ELBF(t, b, i, f, x...) do { if ((e_logbuf_type) & (t)) { e_logbuf_fmt_add((t), (b), __FUNCTION__, __LINE__, (i), f, ##x); } } while (0);
+#define ELB_BACKTRACE() \
+ do \
+ { \
+ void* frame_addrs[16]; \
+ char** frame_strings; \
+ size_t backtrace_size; \
+ int i; \
+ backtrace_size = backtrace(frame_addrs, 16); \
+ frame_strings = backtrace_symbols(frame_addrs, backtrace_size); \
+ for (i = 0; i < backtrace_size; ++i) \
+ { \
+ ELBF(ELBT_TRACE, 0, 0, "%d: [0x%x] %s", i, frame_addrs[i], frame_strings[i]); \
+ } \
+ free(frame_strings); \
+ } \
+ while (0);
#else
#define ELB(...) ;
#define ELBF(...) ;
+#define ELB_BACKTRACE() ;
#endif
#endif
void (*src_shadow_show) (void *data, E_Manager *man, E_Manager_Comp_Source *src);
void (*src_shadow_hide) (void *data, E_Manager *man, E_Manager_Comp_Source *src);
#endif
+#ifdef _F_COMP_LAYER_
+ Evas_Object * (*layer_get) (void *data, E_Manager *man, E_Zone *zone, const char *name);
+#endif
} func;
void *data;
};
EAPI Eina_Bool e_manager_comp_input_region_id_del(E_Manager *man, int id);
#endif
#ifdef _F_COMP_MOVE_LOCK_
-EAPI Eina_Bool e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src);
-EAPI Eina_Bool e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src);
+EAPI Eina_Bool e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src); /* deprecated */
+EAPI Eina_Bool e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src); /* deprecated */
#endif
#ifdef _F_COMP_COMPOSITE_MODE_
// set the composite rendering state of a zone.
EAPI void e_manager_comp_src_shadow_show(E_Manager *man, E_Manager_Comp_Source *src);
EAPI void e_manager_comp_src_shadow_hide(E_Manager *man, E_Manager_Comp_Source *src);
#endif
+#ifdef _F_COMP_LAYER_
+// get compositor's layer by specific name
+EAPI Evas_Object *e_manager_comp_layer_get(E_Manager *man, E_Zone *zone, const char *name);
+#endif
#endif
#endif
int i, do_precache = 0, valgrind_mode = 0;
int valgrind_tool = 0;
int valgrind_gdbserver = 0;
+#ifdef _F_SET_USER_GROUP_
+ int res;
+ char *user;
+ int user_id;
+ int group_id;
+#endif /* _F_SET_USER_GROUP_ */
char buf[16384], **args, *p;
char valgrind_path[PATH_MAX] = "";
const char *valgrind_log = NULL;
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "-no-precache")) do_precache = 0;
+#ifdef _F_SET_USER_GROUP_
+ else if (!strncmp(argv[i], "-user", sizeof("-user") - 1))
+ {
+ if (sscanf(argv[i+1], "%d", &user_id) <= 0) user_id = 0;
+ else i++;
+ }
+ else if (!strncmp(argv[i], "-group", sizeof("-group") - 1))
+ {
+ if (sscanf(argv[i+1], "%d", &group_id) <= 0) group_id = 0;
+ else i++;
+ }
+#endif /* _F_SET_USER_GROUP_ */
else if (!strcmp(argv[i], "-valgrind-gdb")) valgrind_gdbserver = 1;
else if (!strncmp(argv[i], "-valgrind", sizeof("-valgrind") - 1))
{
printf
(
"Options:\n"
+#ifdef _F_SET_USER_GROUP_
+ "\t-user [user id in integer value]\n"
+ "\t-group [group id in integer value]\n"
+#endif /* _F_SET_USER_GROUP_ */
"\t-no-precache\n"
"\t\tDisable pre-caching of files\n"
"\t-valgrind[=MODE]\n"
really_know = EINA_TRUE;
}
+#ifdef _F_SET_USER_GROUP_
+ if (group_id)
+ {
+ user = getenv("USER");
+
+ if (user)
+ {
+ res = initgroups(user, (gid_t)group_id);
+
+ if (res)
+ {
+ printf("Failed to set groups !(errno=%d)\n", errno);
+ }
+ }
+ }
+
+ if ((group_id) && setgid((gid_t)group_id) && setegid((gid_t)group_id))
+ {
+ printf("Fail to set group to %d. errno=%d\n", group_id, errno);
+ }
+ if ((user_id) && setuid((uid_t)user_id) && seteuid((uid_t)user_id))
+ {
+ printf("Fail to set user to %d. errno=%d\n", user_id, errno);
+ }
+#endif /* _F_SET_USER_GROUP_ */
+
if (really_know)
{
_env_path_append("PATH", eina_prefix_bin_get(pfx));