diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 1d6d7fde7..de7719c7c 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -3421,11 +3421,6 @@ _e_border_cb_window_move_resize_request(void *data, int ev_type, void *ev) } else if (e->direction == MOVE) { - if (!_e_border_move_begin(bd)) - return 1; - bd->moving = 1; - e_zone_flip_win_disable(); - bd->cur_mouse_action = e_action_find("window_move"); if (bd->cur_mouse_action) { @@ -3433,7 +3428,10 @@ _e_border_cb_window_move_resize_request(void *data, int ev_type, void *ev) (!bd->cur_mouse_action->func.end)) bd->cur_mouse_action = NULL; if (bd->cur_mouse_action) - e_object_ref(E_OBJECT(bd->cur_mouse_action)); + { + e_object_ref(E_OBJECT(bd->cur_mouse_action)); + bd->cur_mouse_action->func.go(E_OBJECT(bd), NULL); + } } } return 1; @@ -3860,8 +3858,6 @@ _e_border_cb_mouse_up(void *data, int type, void *event) } bd->mouse.current.mx = ev->root.x; bd->mouse.current.my = ev->root.y; - /* bug/problem. this action COULD be deleted during a move */ - /* ... VERY unlikely though... VERY */ /* also we dont pass the same params that went in - then again that */ /* should be ok as we are just ending the action if it has an end */ if (bd->cur_mouse_action) @@ -4835,6 +4831,11 @@ _e_border_eval(E_Border *bd) &new_x, &new_y); evas_list_free(skiplist); } + else if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_MANUAL) + { + e_place_zone_manual(bd->zone, bd->x, bd->w, bd->client_inset.t, + &new_x, &new_y); + } else { e_place_zone_cursor(bd->zone, bd->x, bd->y, bd->w, bd->h, @@ -4886,7 +4887,7 @@ _e_border_eval(E_Border *bd) bd->placed = 1; bd->changes.pos = 1; } - + ecore_x_icccm_move_resize_send(bd->client.win, bd->x + bd->client_inset.l, bd->y + bd->client_inset.t, @@ -5211,6 +5212,42 @@ _e_border_eval(E_Border *bd) { ecore_evas_show(bd->bg_ecore_evas); ecore_x_window_show(bd->win); + if ((!bd->re_manage) && + (e_config->window_placement_policy == E_WINDOW_PLACEMENT_MANUAL) && + (!move) && (!resize)) + { + /* Set this window into moving state */ + int x, y; + + bd->cur_mouse_action = e_action_find("window_move"); + if (bd->cur_mouse_action) + { + if ((!bd->cur_mouse_action->func.end_mouse) && + (!bd->cur_mouse_action->func.end)) + bd->cur_mouse_action = NULL; + if (bd->cur_mouse_action) + { + ecore_x_pointer_xy_get(bd->zone->container->win, &x, &y); + + bd->x = x - bd->w / 2; + bd->y = y - bd->client_inset.t / 2; + + bd->moveinfo.down.x = bd->x; + bd->moveinfo.down.y = bd->y; + bd->moveinfo.down.w = bd->w; + bd->moveinfo.down.h = bd->h; + bd->mouse.current.mx = x; + bd->mouse.current.my = y; + bd->moveinfo.down.button = 0; + bd->moveinfo.down.mx = x; + bd->moveinfo.down.my = y; + + grabbed = 1; + e_object_ref(E_OBJECT(bd->cur_mouse_action)); + bd->cur_mouse_action->func.go(E_OBJECT(bd), NULL); + } + } + } bd->changes.visible = 0; } bd->new_client = 0; @@ -6835,8 +6872,8 @@ _e_border_resize_begin(E_Border *bd) if (!bd->lock_user_stacking) e_border_raise(bd); - if ((bd->shaded) || (bd->shading) || (bd->maximized == E_MAXIMIZE_FULLSCREEN) || (bd->fullscreen) || - (bd->lock_user_size)) + if ((bd->shaded) || (bd->shading) || (bd->maximized == E_MAXIMIZE_FULLSCREEN) || + (bd->fullscreen) || (bd->lock_user_size)) return 0; if ((bd->client.icccm.base_w >= 0) && @@ -6863,7 +6900,7 @@ _e_border_resize_begin(E_Border *bd) h = bd->client.h; } if (grabbed) - ecore_x_pointer_grab(bd->win); + e_grabinput_get(bd->win, 0, bd->win); if (bd->client.netwm.sync.request) { bd->client.netwm.sync.alarm = ecore_x_sync_alarm_new(bd->client.netwm.sync.counter); @@ -6884,7 +6921,7 @@ static int _e_border_resize_end(E_Border *bd) { if (grabbed) - ecore_x_pointer_ungrab(); + e_grabinput_release(bd->win, bd->win); grabbed = 0; if (bd->client.netwm.sync.alarm) { @@ -6939,8 +6976,9 @@ _e_border_move_begin(E_Border *bd) if ((bd->maximized == E_MAXIMIZE_FULLSCREEN) || (bd->fullscreen) || (bd->lock_user_location)) return 0; + printf("Grabbed: %d\n", grabbed); if (grabbed) - ecore_x_pointer_grab(bd->win); + e_grabinput_get(bd->win, 0, bd->win); #if 0 if (bd->client.netwm.sync.request) { @@ -6963,7 +7001,7 @@ static int _e_border_move_end(E_Border *bd) { if (grabbed) - ecore_x_pointer_ungrab(); + e_grabinput_release(bd->win, bd->win); grabbed = 0; #if 0 if (bd->client.netwm.sync.alarm) diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 65c2f300c..4dfd40f09 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -61,7 +61,8 @@ typedef enum _E_Fullscreen typedef enum _E_Window_Placement { E_WINDOW_PLACEMENT_SMART, - E_WINDOW_PLACEMENT_CURSOR + E_WINDOW_PLACEMENT_CURSOR, + E_WINDOW_PLACEMENT_MANUAL } E_Window_Placement; typedef struct _E_Border E_Border; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index ed71998bb..195d79d23 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -957,7 +957,7 @@ e_config_init(void) E_CONFIG_LIMIT(e_config->zone_desks_y_count, 1, 64); E_CONFIG_LIMIT(e_config->use_edge_flip, 0, 1); E_CONFIG_LIMIT(e_config->edge_flip_timeout, 0.0, 2.0); - E_CONFIG_LIMIT(e_config->window_placement_policy, 0, 1); + E_CONFIG_LIMIT(e_config->window_placement_policy, E_WINDOW_PLACEMENT_SMART, E_WINDOW_PLACEMENT_MANUAL); E_CONFIG_LIMIT(e_config->focus_policy, 0, 2); E_CONFIG_LIMIT(e_config->focus_setting, 0, 3); E_CONFIG_LIMIT(e_config->pass_click_on, 0, 1); diff --git a/src/bin/e_ipc_handlers.h b/src/bin/e_ipc_handlers.h index 937842bae..8b5715f5e 100644 --- a/src/bin/e_ipc_handlers.h +++ b/src/bin/e_ipc_handlers.h @@ -5020,22 +5020,23 @@ break; /****************************************************************************/ #define HDL E_IPC_OP_WINDOW_PLACEMENT_POLICY_SET #if (TYPE == E_REMOTE_OPTIONS) - OP("-window-placement-policy-set", 1, "Set the window placement policy. OPT1 = SMART or CURSOR", 0, HDL) + OP("-window-placement-policy-set", 1, "Set the window placement policy. OPT1 = SMART, CURSOR or MANUAL", 0, HDL) #elif (TYPE == E_REMOTE_OUT) REQ_INT_START(HDL) int value = 0; if (!strcmp(params[0], "SMART")) value = E_WINDOW_PLACEMENT_SMART; else if (!strcmp(params[0], "CURSOR")) value = E_WINDOW_PLACEMENT_CURSOR; + else if (!strcmp(params[0], "MANUAL")) value = E_WINDOW_PLACEMENT_MANUAL; else { - printf("window placement policy must be SMART or CURSOR\n"); + printf("window placement policy must be SMART, CURSOR or MANUAL\n"); exit(-1); } REQ_INT_END(value, HDL); #elif (TYPE == E_WM_IN) START_INT(value, HDL); e_config->window_placement_policy = value; - E_CONFIG_LIMIT(e_config->window_placement_policy, 0, 1); + E_CONFIG_LIMIT(e_config->window_placement_policy, E_WINDOW_PLACEMENT_SMART, E_WINDOW_PLACEMENT_MANUAL); SAVE; END_INT #elif (TYPE == E_REMOTE_IN) @@ -5065,6 +5066,8 @@ break; printf("REPLY: SMART\n"); else if (policy == E_WINDOW_PLACEMENT_CURSOR) printf("REPLY: CURSOR\n"); + else if (policy == E_WINDOW_PLACEMENT_MANUAL) + printf("REPLY: MANUAL\n"); END_INT #endif #undef HDL diff --git a/src/bin/e_place.c b/src/bin/e_place.c index 3750e336b..434822480 100644 --- a/src/bin/e_place.c +++ b/src/bin/e_place.c @@ -480,5 +480,16 @@ e_place_zone_cursor(E_Zone *zone, int x, int y, int w, int h, int it, int *rx, i return 1; } +int +e_place_zone_manual(E_Zone *zone, int x, int w, int it, int *rx, int *ry) +{ + int cursor_x = 0, cursor_y = 0; + E_OBJECT_CHECK_RETURN(zone, 0); + ecore_x_pointer_xy_get(zone->container->win, &cursor_x, &cursor_y); + *rx = cursor_x - ((w - x) >> 1); + *ry = cursor_y - (it >> 1); + + return 1; +} diff --git a/src/bin/e_place.h b/src/bin/e_place.h index 890c566b7..a68e7b8ca 100644 --- a/src/bin/e_place.h +++ b/src/bin/e_place.h @@ -9,6 +9,7 @@ EAPI void e_place_zone_region_smart_cleanup(E_Zone *zone); EAPI int e_place_zone_region_smart(E_Zone *zone, Evas_List *skiplist, int x, int y, int w, int h, int *rx, int *ry); EAPI int e_place_zone_cursor(E_Zone *zone, int x, int y, int w, int h, int it, int *rx, int *ry); +EAPI int e_place_zone_manual(E_Zone *zone, int x, int w, int it, int *rx, int *ry); #endif #endif