2004-12-18 14:26:21 -08:00
|
|
|
/*
|
2004-12-18 15:24:09 -08:00
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
2004-12-18 14:26:21 -08:00
|
|
|
*/
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
#define RESIZE_NONE 0
|
|
|
|
#define RESIZE_TL 1
|
|
|
|
#define RESIZE_T 2
|
|
|
|
#define RESIZE_TR 3
|
|
|
|
#define RESIZE_R 4
|
|
|
|
#define RESIZE_BR 5
|
|
|
|
#define RESIZE_B 6
|
|
|
|
#define RESIZE_BL 7
|
|
|
|
#define RESIZE_L 8
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void _e_border_free(E_Border *bd);
|
2005-01-11 00:11:30 -08:00
|
|
|
static void _e_border_del(E_Border *bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* FIXME: these likely belong in a separate icccm/client handler */
|
|
|
|
/* and the border needs to be come a dumb object that just does what its */
|
|
|
|
/* told to do */
|
|
|
|
static int _e_border_cb_window_show_request(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_destroy(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_hide(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_reparent(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_configure_request(void *data, int ev_type, void *ev);
|
2005-01-06 01:08:20 -08:00
|
|
|
static int _e_border_cb_window_resize_request(void *data, int ev_type, void *ev);
|
2004-11-24 19:37:45 -08:00
|
|
|
static int _e_border_cb_window_gravity(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_stack_request(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_property(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_colormap(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_shape(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_focus_in(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_window_focus_out(void *data, int ev_type, void *ev);
|
|
|
|
static int _e_border_cb_client_message(void *data, int ev_type, void *ev);
|
|
|
|
|
|
|
|
static void _e_border_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_move_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_tl_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_t_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_tr_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_r_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_br_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_b_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_bl_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_l_start(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_resize_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static int _e_border_cb_mouse_in(void *data, int type, void *event);
|
|
|
|
static int _e_border_cb_mouse_out(void *data, int type, void *event);
|
|
|
|
static int _e_border_cb_mouse_down(void *data, int type, void *event);
|
|
|
|
static int _e_border_cb_mouse_up(void *data, int type, void *event);
|
|
|
|
static int _e_border_cb_mouse_move(void *data, int type, void *event);
|
|
|
|
static int _e_border_cb_mouse_wheel(void *data, int type, void *event);
|
2004-12-03 19:55:23 -08:00
|
|
|
static int _e_border_cb_grab_replay(void *data, int type, void *event);
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
static void _e_border_eval(E_Border *bd);
|
|
|
|
static void _e_border_resize_limit(E_Border *bd, int *w, int *h);
|
|
|
|
static void _e_border_moveinfo_gather(E_Border *bd, const char *source);
|
|
|
|
static void _e_border_resize_handle(E_Border *bd);
|
2004-12-18 14:26:21 -08:00
|
|
|
|
|
|
|
static int _e_border_shade_animator(void *data);
|
2005-01-12 01:35:07 -08:00
|
|
|
|
|
|
|
static void _e_border_cb_border_menu_end(void *data, E_Menu *m);
|
2004-12-22 07:50:26 -08:00
|
|
|
static void _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y);
|
|
|
|
static void _e_border_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void _e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void _e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void _e_border_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi);
|
2005-01-07 23:10:13 -08:00
|
|
|
static void _e_border_menu_cb_stick(void *data, E_Menu *m, E_Menu_Item *mi);
|
2004-12-18 14:26:21 -08:00
|
|
|
|
2005-01-10 16:04:46 -08:00
|
|
|
static void _e_border_event_border_add_free(void *data, void *ev);
|
|
|
|
static void _e_border_event_border_remove_free(void *data, void *ev);
|
2005-01-11 00:00:05 -08:00
|
|
|
static void _e_border_event_border_desk_set_free(void *data, void *ev);
|
|
|
|
static void _e_border_event_border_resize_free(void *data, void *ev);
|
|
|
|
static void _e_border_event_border_move_free(void *data, void *ev);
|
|
|
|
static void _e_border_event_border_show_free(void *data, void *ev);
|
|
|
|
static void _e_border_event_border_hide_free(void *data, void *ev);
|
2005-01-10 14:24:23 -08:00
|
|
|
|
2005-01-11 05:11:12 -08:00
|
|
|
static void _e_border_zone_update(E_Border *bd);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem globals */
|
|
|
|
static Evas_List *handlers = NULL;
|
|
|
|
static Evas_List *borders = NULL;
|
2004-11-25 07:32:36 -08:00
|
|
|
static E_Border *focused = NULL;
|
|
|
|
|
2005-01-10 16:04:46 -08:00
|
|
|
int E_EVENT_BORDER_ADD = 0;
|
|
|
|
int E_EVENT_BORDER_REMOVE = 0;
|
2005-01-11 00:00:05 -08:00
|
|
|
int E_EVENT_BORDER_DESK_SET = 0;
|
|
|
|
int E_EVENT_BORDER_RESIZE = 0;
|
|
|
|
int E_EVENT_BORDER_MOVE = 0;
|
|
|
|
int E_EVENT_BORDER_SHOW = 0;
|
|
|
|
int E_EVENT_BORDER_HIDE = 0;
|
2005-01-10 14:24:23 -08:00
|
|
|
|
2004-12-18 20:18:13 -08:00
|
|
|
#define GRAV_SET(bd, grav) \
|
|
|
|
printf("GRAV TO %i\n", grav); \
|
|
|
|
ecore_x_window_gravity_set(bd->bg_win, grav); \
|
|
|
|
ecore_x_window_gravity_set(bd->client.shell_win, grav); \
|
|
|
|
ecore_x_window_gravity_set(bd->client.win, grav); \
|
|
|
|
ecore_x_window_gravity_set(ecore_evas_software_x11_subwindow_get(bd->bg_ecore_evas), grav); \
|
|
|
|
ecore_x_window_pixel_gravity_set(ecore_evas_software_x11_subwindow_get(bd->bg_ecore_evas), grav);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* externally accessible functions */
|
|
|
|
int
|
|
|
|
e_border_init(void)
|
|
|
|
{
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_border_cb_window_show_request, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _e_border_cb_window_destroy, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _e_border_cb_window_hide, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_REPARENT, _e_border_cb_window_reparent, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, _e_border_cb_window_configure_request, NULL));
|
2005-01-06 01:08:20 -08:00
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, _e_border_cb_window_resize_request, NULL));
|
2004-11-24 19:37:45 -08:00
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_GRAVITY, _e_border_cb_window_gravity, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, _e_border_cb_window_stack_request, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_border_cb_window_property, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_COLORMAP, _e_border_cb_window_colormap, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE, _e_border_cb_window_shape, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _e_border_cb_window_focus_in, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _e_border_cb_window_focus_out, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_border_cb_client_message, NULL));
|
2004-12-03 19:55:23 -08:00
|
|
|
ecore_x_passive_grab_replay_func_set(_e_border_cb_grab_replay, NULL);
|
2005-01-10 14:24:23 -08:00
|
|
|
|
2005-01-10 16:04:46 -08:00
|
|
|
E_EVENT_BORDER_ADD = ecore_event_type_new();
|
|
|
|
E_EVENT_BORDER_REMOVE = ecore_event_type_new();
|
2005-01-13 04:19:55 -08:00
|
|
|
E_EVENT_BORDER_DESK_SET = ecore_event_type_new();
|
2005-01-11 00:00:05 -08:00
|
|
|
E_EVENT_BORDER_RESIZE = ecore_event_type_new();
|
|
|
|
E_EVENT_BORDER_MOVE = ecore_event_type_new();
|
|
|
|
E_EVENT_BORDER_SHOW = ecore_event_type_new();
|
|
|
|
E_EVENT_BORDER_HIDE = ecore_event_type_new();
|
2005-01-10 14:24:23 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
e_border_shutdown(void)
|
|
|
|
{
|
|
|
|
while (handlers)
|
|
|
|
{
|
|
|
|
Ecore_Event_Handler *h;
|
|
|
|
|
|
|
|
h = handlers->data;
|
|
|
|
handlers = evas_list_remove(handlers, h);
|
|
|
|
ecore_event_handler_del(h);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Border *
|
|
|
|
e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Window_Attributes *att;
|
|
|
|
|
|
|
|
bd = E_OBJECT_ALLOC(E_Border, _e_border_free);
|
|
|
|
if (!bd) return NULL;
|
2005-01-11 05:11:12 -08:00
|
|
|
e_object_del_func_set(E_OBJECT(bd), E_OBJECT_CLEANUP_FUNC(_e_border_del));
|
2005-01-11 00:11:30 -08:00
|
|
|
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- NEW CLIENT 0x%x\n", win);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->w = 1;
|
|
|
|
bd->h = 1;
|
|
|
|
bd->win = ecore_x_window_override_new(bd->container->win, 0, 0, bd->w, bd->h);
|
2004-12-03 19:55:23 -08:00
|
|
|
/* FIXME: use config list of bindings */
|
|
|
|
ecore_x_window_button_grab(bd->win,
|
|
|
|
1,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE,
|
|
|
|
ECORE_X_MODIFIER_ALT,
|
|
|
|
0);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->bg_ecore_evas = ecore_evas_software_x11_new(NULL, bd->win, 0, 0, bd->w, bd->h);
|
|
|
|
ecore_evas_software_x11_direct_resize_set(bd->bg_ecore_evas, 1);
|
|
|
|
e_canvas_add(bd->bg_ecore_evas);
|
|
|
|
bd->event_win = ecore_x_window_input_new(bd->win, 0, 0, bd->w, bd->h);
|
|
|
|
bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas);
|
|
|
|
bd->bg_win = ecore_evas_software_x11_window_get(bd->bg_ecore_evas);
|
|
|
|
ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window");
|
|
|
|
ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame");
|
2005-01-03 17:32:23 -08:00
|
|
|
ecore_evas_avoid_damage_set(bd->bg_ecore_evas, 1);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_evas_show(bd->bg_ecore_evas);
|
|
|
|
evas_font_path_append(bd->bg_evas, e_path_find(path_data, "fonts"));
|
|
|
|
bd->client.shell_win = ecore_x_window_override_new(bd->win, 0, 0, 1, 1);
|
|
|
|
ecore_x_window_container_manage(bd->client.shell_win);
|
|
|
|
ecore_x_window_client_manage(win);
|
|
|
|
/* FIXME: Round trip. XCB */
|
2005-01-06 01:08:20 -08:00
|
|
|
/* fetch needed to avoid grabbing the server as window may vanish */
|
2004-11-24 19:37:45 -08:00
|
|
|
att = &bd->client.initial_attributes;
|
|
|
|
if ((!ecore_x_window_attributes_get(win, att)) || (att->input_only))
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- ATTR FETCH FAILED/INPUT ONLY FOR 0x%x - ABORT MANAGE\n", win);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_canvas_del(bd->bg_ecore_evas);
|
|
|
|
ecore_evas_free(bd->bg_ecore_evas);
|
|
|
|
ecore_x_window_del(bd->client.shell_win);
|
|
|
|
ecore_x_window_del(bd->win);
|
|
|
|
free(bd);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _e_border_cb_mouse_in, bd));
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _e_border_cb_mouse_out, bd));
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _e_border_cb_mouse_down, bd));
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_border_cb_mouse_up, bd));
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_border_cb_mouse_move, bd));
|
|
|
|
bd->handlers = evas_list_append(bd->handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, _e_border_cb_mouse_wheel, bd));
|
|
|
|
|
|
|
|
bd->client.win = win;
|
|
|
|
|
|
|
|
bd->client.icccm.title = strdup("");
|
|
|
|
bd->client.icccm.name = strdup("");
|
|
|
|
bd->client.icccm.class = strdup("");
|
|
|
|
bd->client.icccm.icon_name = strdup("");
|
|
|
|
bd->client.icccm.machine = strdup("");
|
|
|
|
bd->client.icccm.min_w = 1;
|
|
|
|
bd->client.icccm.min_h = 1;
|
|
|
|
bd->client.icccm.max_w = 32767;
|
|
|
|
bd->client.icccm.max_h = 32767;
|
|
|
|
bd->client.icccm.base_w = 0;
|
|
|
|
bd->client.icccm.base_h = 0;
|
|
|
|
bd->client.icccm.step_w = 1;
|
|
|
|
bd->client.icccm.step_h = 1;
|
|
|
|
bd->client.icccm.min_aspect = 0.0;
|
|
|
|
bd->client.icccm.max_aspect = 0.0;
|
2004-11-28 23:40:06 -08:00
|
|
|
bd->client.icccm.accepts_focus = 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
bd->client.icccm.fetch.title = 1;
|
|
|
|
bd->client.icccm.fetch.name_class = 1;
|
|
|
|
bd->client.icccm.fetch.icon_name = 1;
|
|
|
|
bd->client.icccm.fetch.machine = 1;
|
|
|
|
bd->client.icccm.fetch.hints = 1;
|
|
|
|
bd->client.icccm.fetch.size_pos_hints = 1;
|
|
|
|
bd->client.icccm.fetch.protocol = 1;
|
2004-11-25 06:09:49 -08:00
|
|
|
bd->client.mwm.fetch.hints = 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.netwm.fetch.pid = 1;
|
|
|
|
bd->client.netwm.fetch.desktop = 1;
|
|
|
|
bd->client.border.changed = 1;
|
|
|
|
|
|
|
|
bd->client.w = att->w;
|
|
|
|
bd->client.h = att->h;
|
|
|
|
|
|
|
|
bd->w = bd->client.w;
|
|
|
|
bd->h = bd->client.h;
|
|
|
|
bd->changes.size = 1;
|
2005-01-06 01:08:20 -08:00
|
|
|
|
|
|
|
printf("##- ON MAP CLIENT 0x%x SIZE %ix%i\n",
|
|
|
|
bd->client.win, bd->client.w, bd->client.h);
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* FIXME: if first_map is 1 then we should ignore the first hide event
|
|
|
|
* or ensure the window is alreayd hidden and events flushed before we
|
|
|
|
* create a border for it
|
|
|
|
*/
|
|
|
|
if (first_map)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- FIRST MAP\n");
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->x = att->x;
|
|
|
|
bd->y = att->y;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
bd->re_manage = 1;
|
|
|
|
bd->ignore_first_unmap = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
ecore_x_window_save_set_add(win);
|
|
|
|
ecore_x_window_reparent(win, bd->client.shell_win, 0, 0);
|
|
|
|
ecore_x_window_border_width_set(win, 0);
|
|
|
|
ecore_x_window_show(bd->event_win);
|
|
|
|
ecore_x_window_show(bd->client.shell_win);
|
|
|
|
bd->shape = e_container_shape_add(con);
|
|
|
|
|
|
|
|
bd->new_client = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
2005-01-19 06:31:40 -08:00
|
|
|
bd->container = con;
|
|
|
|
bd->zone = e_zone_current_get(con);
|
|
|
|
bd->zone->clients = evas_list_append(bd->zone->clients, bd);
|
|
|
|
bd->desk = e_desk_current_get(bd->zone);
|
|
|
|
bd->desk->clients = evas_list_append(bd->desk->clients, bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
con->clients = evas_list_append(con->clients, bd);
|
|
|
|
borders = evas_list_append(borders, bd);
|
2005-01-03 17:32:23 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
return bd;
|
|
|
|
}
|
|
|
|
|
2005-01-05 02:37:53 -08:00
|
|
|
void
|
|
|
|
e_border_desk_set(E_Border *bd, E_Desk *desk)
|
|
|
|
{
|
2005-01-11 00:00:05 -08:00
|
|
|
E_Event_Border_Desk_Set *ev;
|
|
|
|
|
2005-01-05 02:37:53 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
|
|
|
E_OBJECT_CHECK(desk);
|
|
|
|
if (bd->desk == desk) return;
|
|
|
|
bd->desk->clients = evas_list_remove(bd->desk->clients, bd);
|
|
|
|
desk->clients = evas_list_append(desk->clients, bd);
|
|
|
|
bd->desk = desk;
|
2005-01-11 00:00:05 -08:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Desk_Set));
|
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-11 00:00:05 -08:00
|
|
|
ev->desk = desk;
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(desk));
|
2005-01-11 00:00:05 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_DESK_SET, ev, _e_border_event_border_desk_set_free, NULL);
|
2005-01-05 02:37:53 -08:00
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
void
|
|
|
|
e_border_show(E_Border *bd)
|
|
|
|
{
|
2005-01-11 00:00:05 -08:00
|
|
|
E_Event_Border_Show *ev;
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (bd->visible) return;
|
|
|
|
e_container_shape_show(bd->shape);
|
|
|
|
ecore_x_window_show(bd->client.win);
|
|
|
|
ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_NORMAL);
|
|
|
|
bd->visible = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
bd->changes.visible = 1;
|
2005-01-11 00:00:05 -08:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Show));
|
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-11 00:00:05 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_SHOW, ev, _e_border_event_border_show_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_hide(E_Border *bd)
|
|
|
|
{
|
2005-01-11 00:00:05 -08:00
|
|
|
E_Event_Border_Hide *ev;
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!bd->visible) return;
|
2004-12-20 19:01:19 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_x_window_hide(bd->client.win);
|
|
|
|
e_container_shape_hide(bd->shape);
|
2004-12-20 19:01:19 -08:00
|
|
|
|
|
|
|
if (bd->iconic)
|
2005-01-05 01:31:56 -08:00
|
|
|
ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_ICONIC);
|
2004-12-20 19:01:19 -08:00
|
|
|
else
|
2005-01-05 01:12:15 -08:00
|
|
|
ecore_x_icccm_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HINT_WITHDRAWN);
|
2004-12-20 19:01:19 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->visible = 0;
|
|
|
|
bd->changed = 1;
|
|
|
|
bd->changes.visible = 1;
|
2005-01-11 00:00:05 -08:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Hide));
|
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-11 00:00:05 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_HIDE, ev, _e_border_event_border_hide_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_move(E_Border *bd, int x, int y)
|
|
|
|
{
|
2005-01-10 16:04:46 -08:00
|
|
|
E_Event_Border_Move *ev;
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2005-01-12 22:08:07 -08:00
|
|
|
if (bd->new_client)
|
|
|
|
{
|
|
|
|
E_Border_Pending_Move_Resize *pnd;
|
|
|
|
|
|
|
|
pnd = E_NEW(E_Border_Pending_Move_Resize, 1);
|
|
|
|
pnd->move = 1;
|
|
|
|
pnd->x = x;
|
|
|
|
pnd->y = y;
|
|
|
|
bd->pending_move_resize = evas_list_append(bd->pending_move_resize, pnd);
|
|
|
|
return;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((x == bd->x) && (y == bd->y)) return;
|
|
|
|
bd->x = x;
|
|
|
|
bd->y = y;
|
|
|
|
bd->changed = 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,
|
|
|
|
bd->client.w,
|
|
|
|
bd->client.h);
|
2005-01-11 05:11:12 -08:00
|
|
|
_e_border_zone_update(bd);
|
2005-01-11 00:00:05 -08:00
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Move));
|
2005-01-10 16:04:46 -08:00
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-10 23:19:31 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_MOVE, ev, _e_border_event_border_move_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_resize(E_Border *bd, int w, int h)
|
|
|
|
{
|
2005-01-10 16:04:46 -08:00
|
|
|
E_Event_Border_Resize *ev;
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2005-01-12 22:08:07 -08:00
|
|
|
if (bd->new_client)
|
|
|
|
{
|
|
|
|
E_Border_Pending_Move_Resize *pnd;
|
|
|
|
|
|
|
|
pnd = E_NEW(E_Border_Pending_Move_Resize, 1);
|
|
|
|
pnd->resize = 1;
|
|
|
|
pnd->w = w;
|
|
|
|
pnd->h = h;
|
|
|
|
bd->pending_move_resize = evas_list_append(bd->pending_move_resize, pnd);
|
|
|
|
return;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((w == bd->w) && (h == bd->h)) return;
|
|
|
|
bd->w = w;
|
|
|
|
bd->h = h;
|
|
|
|
bd->client.w = bd->w - (bd->client_inset.l + bd->client_inset.r);
|
|
|
|
bd->client.h = bd->h - (bd->client_inset.t + bd->client_inset.b);
|
|
|
|
bd->changed = 1;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
ecore_x_icccm_move_resize_send(bd->client.win,
|
|
|
|
bd->x + bd->client_inset.l,
|
|
|
|
bd->y + bd->client_inset.t,
|
|
|
|
bd->client.w,
|
|
|
|
bd->client.h);
|
2005-01-11 05:11:12 -08:00
|
|
|
_e_border_zone_update(bd);
|
2005-01-10 16:04:46 -08:00
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Resize));
|
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-10 16:04:46 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_move_resize(E_Border *bd, int x, int y, int w, int h)
|
|
|
|
{
|
2005-01-10 23:19:31 -08:00
|
|
|
E_Event_Border_Move *mev;
|
|
|
|
E_Event_Border_Resize *rev;
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2005-01-12 22:08:07 -08:00
|
|
|
if (bd->new_client)
|
|
|
|
{
|
|
|
|
E_Border_Pending_Move_Resize *pnd;
|
|
|
|
|
|
|
|
pnd = E_NEW(E_Border_Pending_Move_Resize, 1);
|
|
|
|
pnd->move = 1;
|
|
|
|
pnd->resize = 1;
|
|
|
|
pnd->x = x;
|
|
|
|
pnd->y = y;
|
|
|
|
pnd->w = w;
|
|
|
|
pnd->h = h;
|
|
|
|
bd->pending_move_resize = evas_list_append(bd->pending_move_resize, pnd);
|
|
|
|
return;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((x == bd->x) && (y == bd->y) && (w == bd->w) && (h == bd->h)) return;
|
|
|
|
bd->x = x;
|
|
|
|
bd->y = y;
|
|
|
|
bd->w = w;
|
|
|
|
bd->h = h;
|
|
|
|
bd->client.w = bd->w - (bd->client_inset.l + bd->client_inset.r);
|
|
|
|
bd->client.h = bd->h - (bd->client_inset.t + bd->client_inset.b);
|
|
|
|
bd->changed = 1;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
ecore_x_icccm_move_resize_send(bd->client.win,
|
|
|
|
bd->x + bd->client_inset.l,
|
|
|
|
bd->y + bd->client_inset.t,
|
|
|
|
bd->client.w,
|
|
|
|
bd->client.h);
|
2005-01-11 05:11:12 -08:00
|
|
|
_e_border_zone_update(bd);
|
2005-01-10 23:19:31 -08:00
|
|
|
mev = calloc(1, sizeof(E_Event_Border_Move));
|
|
|
|
mev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-10 23:19:31 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_MOVE, mev, _e_border_event_border_move_free, NULL);
|
|
|
|
|
|
|
|
rev = calloc(1, sizeof(E_Event_Border_Resize));
|
|
|
|
rev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:53:57 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
2005-01-10 23:19:31 -08:00
|
|
|
ecore_event_add(E_EVENT_BORDER_RESIZE, rev, _e_border_event_border_resize_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2005-01-03 01:34:24 -08:00
|
|
|
/* FIXME: Zone client list is not altered. This affects desktop show function */
|
2004-11-24 19:37:45 -08:00
|
|
|
void
|
|
|
|
e_border_raise(E_Border *bd)
|
|
|
|
{
|
2005-01-06 20:02:03 -08:00
|
|
|
Ecore_X_Window mwin;
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->container->clients = evas_list_remove(bd->container->clients, bd);
|
|
|
|
bd->container->clients = evas_list_append(bd->container->clients, bd);
|
2005-01-06 20:02:03 -08:00
|
|
|
mwin = e_menu_grab_window_get();
|
|
|
|
if (!mwin)
|
|
|
|
ecore_x_window_raise(bd->win);
|
|
|
|
else
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
mwin, ECORE_X_WINDOW_STACK_BELOW);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_lower(E_Border *bd)
|
|
|
|
{
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->container->clients = evas_list_remove(bd->container->clients, bd);
|
|
|
|
bd->container->clients = evas_list_prepend(bd->container->clients, bd);
|
|
|
|
ecore_x_window_lower(bd->win);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_stack_above(E_Border *bd, E_Border *above)
|
|
|
|
{
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->container->clients = evas_list_remove(bd->container->clients, bd);
|
|
|
|
bd->container->clients = evas_list_append_relative(bd->container->clients, bd, above);
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
above->win, ECORE_X_WINDOW_STACK_ABOVE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_stack_below(E_Border *bd, E_Border *below)
|
|
|
|
{
|
2004-11-25 07:32:36 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->container->clients = evas_list_remove(bd->container->clients, bd);
|
|
|
|
bd->container->clients = evas_list_prepend_relative(bd->container->clients, bd, below);
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
below->win, ECORE_X_WINDOW_STACK_BELOW);
|
|
|
|
}
|
|
|
|
|
2004-11-25 07:32:36 -08:00
|
|
|
void
|
|
|
|
e_border_focus_set(E_Border *bd, int focus, int set)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(bd);
|
|
|
|
if (!bd->client.icccm.accepts_focus) return;
|
2004-11-25 07:39:11 -08:00
|
|
|
if ((focus) && (!bd->focused))
|
|
|
|
edje_object_signal_emit(bd->bg_object, "active", "");
|
|
|
|
else if ((!focus) && (bd->focused))
|
|
|
|
edje_object_signal_emit(bd->bg_object, "passive", "");
|
2004-11-25 07:32:36 -08:00
|
|
|
bd->focused = focus;
|
|
|
|
if (set)
|
|
|
|
{
|
|
|
|
if (bd->focused)
|
|
|
|
{
|
|
|
|
if ((focused != bd) && (focused))
|
|
|
|
e_border_focus_set(focused, 0, 0);
|
|
|
|
if (bd->client.icccm.take_focus)
|
2004-12-25 05:13:36 -08:00
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("take focus!\n");
|
2004-12-30 01:11:29 -08:00
|
|
|
ecore_x_icccm_take_focus_send(bd->client.win, ECORE_X_CURRENT_TIME);
|
2005-01-03 01:34:24 -08:00
|
|
|
e_hints_active_window_set(bd->container->manager, bd->client.win);
|
2004-12-25 05:13:36 -08:00
|
|
|
ecore_x_window_focus(bd->client.win);
|
|
|
|
}
|
2004-11-25 07:32:36 -08:00
|
|
|
else
|
2004-12-25 05:13:36 -08:00
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("set focus\n");
|
2004-12-25 05:13:36 -08:00
|
|
|
ecore_x_window_focus(bd->client.win);
|
2005-01-03 01:34:24 -08:00
|
|
|
e_hints_active_window_set(bd->container->manager, bd->client.win);
|
2004-12-25 05:13:36 -08:00
|
|
|
}
|
2004-11-25 07:32:36 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("remove focus\n");
|
2004-11-25 07:32:36 -08:00
|
|
|
ecore_x_window_focus(bd->container->manager->win);
|
2005-01-03 01:34:24 -08:00
|
|
|
e_hints_active_window_set(bd->container->manager, 0);
|
2004-11-25 07:32:36 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((bd->focused) && (focused != bd))
|
|
|
|
focused = bd;
|
|
|
|
else if ((!bd->focused) && (focused == bd))
|
|
|
|
focused = NULL;
|
|
|
|
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("F %x %i\n", bd->client.win, bd->focused);
|
2004-11-25 07:32:36 -08:00
|
|
|
}
|
|
|
|
|
2004-12-10 20:02:26 -08:00
|
|
|
void
|
2004-12-20 13:33:31 -08:00
|
|
|
e_border_shade(E_Border *bd, E_Direction dir)
|
2004-12-10 20:02:26 -08:00
|
|
|
{
|
2005-01-11 00:00:05 -08:00
|
|
|
E_Event_Border_Resize *ev;
|
|
|
|
|
2004-12-10 20:02:26 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-12-19 05:49:35 -08:00
|
|
|
if (bd->maximized) return;
|
2004-12-10 20:02:26 -08:00
|
|
|
if (!bd->shaded)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("SHADE!\n");
|
2004-12-20 13:33:31 -08:00
|
|
|
|
|
|
|
bd->shade.x = bd->x;
|
|
|
|
bd->shade.y = bd->y;
|
|
|
|
bd->shade.dir = dir;
|
|
|
|
|
|
|
|
if (e_config->border_shade_animate)
|
2004-12-18 15:24:09 -08:00
|
|
|
{
|
|
|
|
bd->shade.start = ecore_time_get();
|
|
|
|
bd->shading = 1;
|
|
|
|
bd->changes.shading = 1;
|
|
|
|
bd->changed = 1;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-20 13:33:31 -08:00
|
|
|
if (bd->shade.dir == E_DIRECTION_UP ||
|
|
|
|
bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_SW);
|
|
|
|
else
|
|
|
|
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_NE);
|
|
|
|
|
2004-12-18 15:24:09 -08:00
|
|
|
bd->shade.anim = ecore_animator_add(_e_border_shade_animator, bd);
|
|
|
|
edje_object_signal_emit(bd->bg_object, "shading", "");
|
|
|
|
}
|
2004-12-20 13:33:31 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client_inset.b;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_DOWN)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client_inset.b;
|
|
|
|
bd->y = bd->y + bd->client.h;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client_inset.r;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_RIGHT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client_inset.r;
|
|
|
|
bd->x = bd->x + bd->client.w;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->shaded = 1;
|
|
|
|
bd->changes.shaded = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
edje_object_signal_emit(bd->bg_object, "shaded", "");
|
2005-01-16 21:39:18 -08:00
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Resize));
|
|
|
|
ev->border = bd;
|
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
|
|
|
/* The resize is added in the animator when animation complete */
|
|
|
|
/* For non-animated, we add it immediately with the new size */
|
|
|
|
e_object_ref(E_OBJECT(bd));
|
|
|
|
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
|
2004-12-20 13:33:31 -08:00
|
|
|
}
|
2005-01-11 00:00:05 -08:00
|
|
|
|
2004-12-10 20:02:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-12-20 13:33:31 -08:00
|
|
|
e_border_unshade(E_Border *bd, E_Direction dir)
|
2004-12-10 20:02:26 -08:00
|
|
|
{
|
2005-01-11 00:00:05 -08:00
|
|
|
E_Event_Border_Resize *ev;
|
|
|
|
|
2004-12-10 20:02:26 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-12-19 05:49:35 -08:00
|
|
|
if (bd->maximized) return;
|
2004-12-10 20:02:26 -08:00
|
|
|
if (bd->shaded)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("UNSHADE!\n");
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-20 13:33:31 -08:00
|
|
|
bd->shade.dir = dir;
|
|
|
|
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP ||
|
|
|
|
bd->shade.dir == E_DIRECTION_LEFT)
|
2004-12-18 15:24:09 -08:00
|
|
|
{
|
2004-12-20 13:33:31 -08:00
|
|
|
bd->shade.x = bd->x;
|
|
|
|
bd->shade.y = bd->y;
|
2004-12-18 15:24:09 -08:00
|
|
|
}
|
|
|
|
else
|
2004-12-20 13:33:31 -08:00
|
|
|
{
|
|
|
|
bd->shade.x = bd->x - bd->client.w;
|
|
|
|
bd->shade.y = bd->y - bd->client.h;
|
|
|
|
}
|
|
|
|
if (e_config->border_shade_animate)
|
2004-12-18 15:24:09 -08:00
|
|
|
{
|
|
|
|
bd->shade.start = ecore_time_get();
|
|
|
|
bd->shading = 1;
|
|
|
|
bd->changes.shading = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
2004-12-20 13:33:31 -08:00
|
|
|
if (bd->shade.dir == E_DIRECTION_UP ||
|
|
|
|
bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_SW);
|
|
|
|
else
|
|
|
|
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_NE);
|
|
|
|
|
2004-12-18 15:24:09 -08:00
|
|
|
bd->shade.anim = ecore_animator_add(_e_border_shade_animator, bd);
|
|
|
|
edje_object_signal_emit(bd->bg_object, "unshading", "");
|
|
|
|
}
|
2004-12-20 13:33:31 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client.h + bd->client_inset.b;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_DOWN)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client.h + bd->client_inset.b;
|
|
|
|
bd->y = bd->y - bd->client.h;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client.w + bd->client_inset.r;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_RIGHT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client.w + bd->client_inset.r;
|
|
|
|
bd->x = bd->x - bd->client.w;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->shaded = 0;
|
|
|
|
bd->changes.shaded = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
edje_object_signal_emit(bd->bg_object, "unshaded", "");
|
2005-01-16 21:39:18 -08:00
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Resize));
|
|
|
|
ev->border = bd;
|
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
|
|
|
/* The resize is added in the animator when animation complete */
|
|
|
|
/* For non-animated, we add it immediately with the new size */
|
|
|
|
e_object_ref(E_OBJECT(bd));
|
|
|
|
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
|
2004-12-20 13:33:31 -08:00
|
|
|
}
|
2005-01-11 00:00:05 -08:00
|
|
|
|
2004-12-17 21:47:08 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_maximize(E_Border *bd)
|
|
|
|
{
|
2005-01-03 11:37:50 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
if (!bd->maximized)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("MAXIMIZE!!\n");
|
2004-12-17 21:47:08 -08:00
|
|
|
bd->saved.x = bd->x;
|
|
|
|
bd->saved.y = bd->y;
|
|
|
|
bd->saved.w = bd->w;
|
|
|
|
bd->saved.h = bd->h;
|
|
|
|
|
|
|
|
/* FIXME maximize intelligently */
|
2005-01-06 20:02:03 -08:00
|
|
|
e_border_raise(bd);
|
2005-01-03 01:34:24 -08:00
|
|
|
e_border_move_resize(bd, 0, 0, bd->zone->w, bd->zone->h);
|
2004-12-18 14:26:21 -08:00
|
|
|
bd->maximized = 1;
|
2004-12-17 21:47:08 -08:00
|
|
|
bd->changes.pos = 1;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
|
|
|
edje_object_signal_emit(bd->bg_object, "maximize", "");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_unmaximize(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(bd);
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
if (bd->maximized)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("UNMAXIMIZE!!\n");
|
2004-12-18 14:26:21 -08:00
|
|
|
e_border_move_resize(bd, bd->saved.x, bd->saved.y, bd->saved.w, bd->saved.h);
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-18 14:26:21 -08:00
|
|
|
bd->maximized = 0;
|
2004-12-17 21:47:08 -08:00
|
|
|
bd->changes.pos = 1;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
|
|
|
edje_object_signal_emit(bd->bg_object, "unmaximize", "");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-12-20 13:33:31 -08:00
|
|
|
e_border_iconify(E_Border *bd)
|
2004-12-17 21:47:08 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(bd);
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shading)) return;
|
2004-12-20 19:01:19 -08:00
|
|
|
if (!bd->iconic)
|
2004-12-17 21:47:08 -08:00
|
|
|
{
|
2004-12-20 19:01:19 -08:00
|
|
|
bd->iconic = 1;
|
2004-12-17 21:47:08 -08:00
|
|
|
e_border_hide(bd);
|
2004-12-20 13:33:31 -08:00
|
|
|
edje_object_signal_emit(bd->bg_object, "iconify", "");
|
2004-12-10 20:02:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-12-17 21:47:08 -08:00
|
|
|
void
|
2004-12-20 13:33:31 -08:00
|
|
|
e_border_uniconify(E_Border *bd)
|
2004-12-17 21:47:08 -08:00
|
|
|
{
|
2005-01-05 02:37:53 -08:00
|
|
|
E_Desk *desk;
|
|
|
|
|
2004-12-17 21:47:08 -08:00
|
|
|
E_OBJECT_CHECK(bd);
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shading)) return;
|
2004-12-20 19:01:19 -08:00
|
|
|
if (bd->iconic)
|
2004-12-17 21:47:08 -08:00
|
|
|
{
|
2005-01-05 02:37:53 -08:00
|
|
|
desk = e_desk_current_get(bd->desk->zone);
|
|
|
|
if (desk != bd->desk)
|
|
|
|
e_border_desk_set(bd, desk);
|
2004-12-20 19:01:19 -08:00
|
|
|
bd->iconic = 0;
|
2004-12-17 21:47:08 -08:00
|
|
|
e_border_show(bd);
|
2004-12-20 19:01:19 -08:00
|
|
|
e_iconify_border_remove(bd);
|
2004-12-20 13:33:31 -08:00
|
|
|
edje_object_signal_emit(bd->bg_object, "uniconify", "");
|
2004-12-17 21:47:08 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-01-07 23:10:13 -08:00
|
|
|
void
|
|
|
|
e_border_stick(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(bd);
|
|
|
|
bd->sticky = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_border_unstick(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(bd);
|
|
|
|
bd->sticky = 0;
|
|
|
|
bd->desk = e_desk_current_get(bd->zone);
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_Border *
|
|
|
|
e_border_find_by_client_window(Ecore_X_Window win)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
for (l = borders; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = l->data;
|
|
|
|
if (bd->client.win == win) return bd;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-01-11 05:11:12 -08:00
|
|
|
E_Border *
|
|
|
|
e_border_focused_get(void)
|
|
|
|
{
|
|
|
|
return focused;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
void
|
|
|
|
e_border_idler_before(void)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
for (l = borders; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = l->data;
|
|
|
|
if (bd->changed) _e_border_eval(bd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void
|
|
|
|
_e_border_free(E_Border *bd)
|
|
|
|
{
|
2005-01-12 22:08:07 -08:00
|
|
|
while (bd->pending_move_resize)
|
|
|
|
{
|
|
|
|
free(bd->pending_move_resize->data);
|
|
|
|
bd->pending_move_resize = evas_list_remove_list(bd->pending_move_resize, bd->pending_move_resize);
|
|
|
|
}
|
2005-01-12 01:35:07 -08:00
|
|
|
if (bd->border_menu)
|
|
|
|
{
|
|
|
|
e_object_del(E_OBJECT(bd->border_menu));
|
|
|
|
bd->border_menu = NULL;
|
|
|
|
}
|
2004-11-25 07:32:36 -08:00
|
|
|
if (focused == bd) focused = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
while (bd->handlers)
|
|
|
|
{
|
|
|
|
Ecore_Event_Handler *h;
|
|
|
|
|
|
|
|
h = bd->handlers->data;
|
|
|
|
bd->handlers = evas_list_remove(bd->handlers, h);
|
|
|
|
ecore_event_handler_del(h);
|
|
|
|
}
|
|
|
|
ecore_x_window_reparent(bd->client.win, bd->container->manager->root, bd->x + bd->client_inset.l, bd->y + bd->client_inset.t);
|
|
|
|
ecore_x_window_save_set_del(bd->client.win);
|
|
|
|
if (bd->client.border.name) free(bd->client.border.name);
|
|
|
|
if (bd->client.icccm.title) free(bd->client.icccm.title);
|
|
|
|
if (bd->client.icccm.name) free(bd->client.icccm.name);
|
|
|
|
if (bd->client.icccm.class) free(bd->client.icccm.class);
|
|
|
|
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
|
|
|
|
if (bd->client.icccm.machine) free(bd->client.icccm.machine);
|
|
|
|
e_object_del(E_OBJECT(bd->shape));
|
2004-12-02 02:07:51 -08:00
|
|
|
if (bd->icon_object) evas_object_del(bd->icon_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
evas_object_del(bd->bg_object);
|
|
|
|
e_canvas_del(bd->bg_ecore_evas);
|
|
|
|
ecore_evas_free(bd->bg_ecore_evas);
|
|
|
|
ecore_x_window_del(bd->client.shell_win);
|
2004-12-03 19:55:23 -08:00
|
|
|
/* FIXME: use config list of bindings */
|
|
|
|
ecore_x_window_button_ungrab(bd->win,
|
|
|
|
1,
|
|
|
|
ECORE_X_MODIFIER_ALT,
|
|
|
|
0);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_x_window_del(bd->win);
|
2005-01-13 05:55:00 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->container->clients = evas_list_remove(bd->container->clients, bd);
|
2005-01-10 12:54:20 -08:00
|
|
|
bd->zone->clients = evas_list_remove(bd->zone->clients, bd);
|
|
|
|
bd->desk->clients = evas_list_remove(bd->desk->clients, bd);
|
2005-01-13 05:55:00 -08:00
|
|
|
borders = evas_list_remove(borders, bd);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
free(bd);
|
|
|
|
}
|
|
|
|
|
2005-01-11 00:11:30 -08:00
|
|
|
static void
|
|
|
|
_e_border_del(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_Event_Border_Remove *ev;
|
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Remove));
|
|
|
|
ev->border = bd;
|
2005-01-14 06:01:08 -08:00
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
2005-01-11 00:11:30 -08:00
|
|
|
e_object_ref(E_OBJECT(bd));
|
|
|
|
ecore_event_add(E_EVENT_BORDER_REMOVE, ev, _e_border_event_border_remove_free, NULL);
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static int
|
|
|
|
_e_border_cb_window_show_request(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Show_Request *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int _e_border_cb_window_destroy(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Destroy *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2005-01-15 07:21:57 -08:00
|
|
|
e_border_hide(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_object_del(E_OBJECT(bd));
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_hide(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Hide *e;
|
2005-01-15 07:21:57 -08:00
|
|
|
int was_iconic = 0, was_visible = 0;
|
2004-12-20 19:01:19 -08:00
|
|
|
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("in hide cb\n");
|
2004-11-24 19:37:45 -08:00
|
|
|
bd = data;
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
|
|
|
if (bd->ignore_first_unmap > 0)
|
|
|
|
{
|
|
|
|
bd->ignore_first_unmap--;
|
|
|
|
return 1;
|
|
|
|
}
|
2005-01-05 01:31:56 -08:00
|
|
|
/* Don't delete hidden or iconified windows */
|
2005-01-15 07:21:57 -08:00
|
|
|
was_iconic = bd->iconic;
|
|
|
|
was_visible = bd->visible;
|
|
|
|
e_border_hide(bd);
|
|
|
|
if (!(was_iconic) && (was_visible)) e_object_del(E_OBJECT(bd));
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_reparent(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Reparent *e;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
|
|
|
if (e->parent == bd->client.shell_win) return 1;
|
2005-01-15 07:21:57 -08:00
|
|
|
e_border_hide(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_object_del(E_OBJECT(bd));
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_configure_request(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Configure_Request *e;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
e = ev;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- CONF REQ 0x%x , %iX%i+%i+%i\n",
|
|
|
|
e->win, e->w, e->h, e->x, e->y);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd)
|
|
|
|
{
|
|
|
|
printf("generic config request %x %i %i %ix%i ...\n",
|
|
|
|
e->win, e->x, e->y, e->w, e->h);
|
|
|
|
ecore_x_window_configure(e->win, e->value_mask,
|
|
|
|
e->x, e->y, e->w, e->h, e->border,
|
|
|
|
e->abovewin, e->detail);
|
|
|
|
return 1;
|
|
|
|
}
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- CONFIGURE REQ 0x%0x mask: %c%c%c%c%c%c%c\n",
|
|
|
|
e->win,
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_X) ? 'X':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_Y) ? 'Y':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W) ? 'W':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H) ? 'H':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_BORDER_WIDTH) ? 'B':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING) ? 'C':' ',
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE) ? 'S':' '
|
|
|
|
);
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
if ((e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_X) ||
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_Y))
|
|
|
|
{
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
y = bd->y;
|
|
|
|
x = bd->x;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- ASK FOR 0x%x TO MOVE TO [FLG X%iY%i] %i,%i\n",
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_X,
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_Y,
|
|
|
|
bd->client.win, x, y);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_X)
|
2005-01-12 22:44:19 -08:00
|
|
|
x = e->x;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_Y)
|
2005-01-12 22:44:19 -08:00
|
|
|
y = e->y;
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W) ||
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H))
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
h = bd->h;
|
|
|
|
w = bd->w;
|
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W)
|
|
|
|
w = e->w + bd->client_inset.l + bd->client_inset.r;
|
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H)
|
|
|
|
h = e->h + bd->client_inset.t + bd->client_inset.b;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- ASK FOR 0x%x TO RESIZE TO [FLG W%iH%i] %i,%i\n",
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W,
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H,
|
|
|
|
bd->client.win, e->w, e->h);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_border_move_resize(bd, x, y, w, h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
e_border_move(bd, x, y);
|
|
|
|
}
|
|
|
|
else if ((e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W) ||
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H))
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
h = bd->h;
|
|
|
|
w = bd->w;
|
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W)
|
|
|
|
w = e->w + bd->client_inset.l + bd->client_inset.r;
|
|
|
|
if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H)
|
|
|
|
h = e->h + bd->client_inset.t + bd->client_inset.b;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- ASK FOR 0x%x TO RESIZE TO [FLG W%iH%i] %i,%i\n",
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_W,
|
|
|
|
e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_H,
|
|
|
|
bd->client.win, e->w, e->h);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_border_resize(bd, w, h);
|
|
|
|
}
|
|
|
|
if ((e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE) &&
|
|
|
|
(e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING))
|
|
|
|
{
|
|
|
|
E_Border *obd;
|
|
|
|
|
|
|
|
if (e->detail == ECORE_X_WINDOW_STACK_ABOVE)
|
|
|
|
{
|
|
|
|
obd = e_border_find_by_client_window(e->abovewin);
|
|
|
|
if (obd)
|
|
|
|
e_border_stack_above(bd, obd);
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_BELOW)
|
|
|
|
{
|
|
|
|
obd = e_border_find_by_client_window(e->abovewin);
|
|
|
|
if (obd)
|
|
|
|
e_border_stack_below(bd, obd);
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_TOP_IF)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_BOTTOM_IF)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_OPPOSITE)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (e->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE)
|
|
|
|
{
|
|
|
|
if (e->detail == ECORE_X_WINDOW_STACK_ABOVE)
|
|
|
|
{
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_BELOW)
|
|
|
|
{
|
|
|
|
e_border_lower(bd);
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_TOP_IF)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_BOTTOM_IF)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
else if (e->detail == ECORE_X_WINDOW_STACK_OPPOSITE)
|
|
|
|
{
|
|
|
|
/* FIXME: do */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2005-01-06 01:08:20 -08:00
|
|
|
static int
|
|
|
|
_e_border_cb_window_resize_request(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Resize_Request *e;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
e = ev;
|
|
|
|
printf("##- RESZ REQ 0x%x , %iX%i\n",
|
|
|
|
e->win, e->w, e->h);
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd)
|
|
|
|
{
|
|
|
|
printf("generic resize request %x %ix%i ...\n",
|
|
|
|
e->win, e->w, e->h);
|
|
|
|
ecore_x_window_resize(e->win, e->w, e->h);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("##- RESIZE REQ 0x%0x\n");
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
h = bd->h;
|
|
|
|
w = bd->w;
|
|
|
|
w = e->w + bd->client_inset.l + bd->client_inset.r;
|
|
|
|
h = e->h + bd->client_inset.t + bd->client_inset.b;
|
|
|
|
printf("##- ASK FOR 0x%x TO RESIZE TO %i,%i\n",
|
|
|
|
bd->client.win, e->w, e->h);
|
|
|
|
e_border_resize(bd, w, h);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static int
|
|
|
|
_e_border_cb_window_gravity(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Gravity *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("gravity for %0x\n", e->win);
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_stack_request(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Stack_Request *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("stack req for %0x bd %p\n", e->win, bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!bd) return 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_property(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Property *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2004-12-05 01:30:59 -08:00
|
|
|
if (e->atom == ECORE_X_ATOM_WM_NAME)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.title = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_CLASS)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.name_class = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_ICON_NAME)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.icon_name = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.machine = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_PROTOCOLS)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.protocol = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_HINTS)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.hints = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_WM_NORMAL_HINTS)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.icccm.fetch.size_pos_hints = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_MOTIF_WM_HINTS)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.mwm.fetch.hints = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_NET_WM_PID)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.netwm.fetch.pid = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-12-05 01:30:59 -08:00
|
|
|
else if (e->atom == ECORE_X_ATOM_NET_WM_DESKTOP)
|
2004-12-01 23:43:33 -08:00
|
|
|
{
|
|
|
|
bd->client.netwm.fetch.desktop = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
// bd->client.border.changed = 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_colormap(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Colormap *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_shape(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Shape *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_focus_in(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Focus_In *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("f IN %i | %i\n", e->mode, e->detail);
|
2004-11-25 07:32:36 -08:00
|
|
|
e_border_focus_set(bd, 1, 0);
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_window_focus_out(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Window_Focus_Out *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2004-12-25 05:13:36 -08:00
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_NORMAL) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_INFERIOR)) return 1;
|
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR)) return 1;
|
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_INFERIOR)) return 1;
|
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL)) return 1;
|
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_UNGRAB) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_INFERIOR)) return 1;
|
|
|
|
if ((e->mode == ECORE_X_EVENT_MODE_WHILE_GRABBED) &&
|
|
|
|
(e->detail == ECORE_X_EVENT_DETAIL_ANCESTOR)) return 1;
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("f OUT %i | %i\n", e->mode, e->detail);
|
2004-11-25 07:32:36 -08:00
|
|
|
e_border_focus_set(bd, 0, 0);
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_client_message(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
Ecore_X_Event_Client_Message *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) return 1;
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("client message for %0x\n", e->win);
|
2004-11-25 06:57:48 -08:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
bd->moving = 1;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_move_stop(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
bd->moving = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_tl_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_TL;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_SE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_t_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_T;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_S);
|
|
|
|
ecore_x_window_gravity_set(bd->bg_win, ECORE_X_GRAVITY_S);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_tr_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_TR;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_SW);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_r_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_R;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_W);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_br_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_BR;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_NW);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_b_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_B;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_N);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_bl_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_BL;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_NE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_l_start(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->resize_mode = RESIZE_L;
|
|
|
|
_e_border_moveinfo_gather(bd, source);
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_E);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_resize_stop(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-12-19 05:49:35 -08:00
|
|
|
if ((bd->shaded) || (bd->shading) || (bd->maximized)) return;
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_border_resize_handle(bd);
|
|
|
|
bd->resize_mode = RESIZE_NONE;
|
|
|
|
bd->changes.reset_gravity = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
printf("action %s\n", source);
|
|
|
|
if (!strcmp(source, "close"))
|
|
|
|
{
|
|
|
|
if (bd->client.icccm.delete_request)
|
|
|
|
ecore_x_window_delete_request_send(bd->client.win);
|
|
|
|
else
|
|
|
|
{
|
2004-12-15 03:48:38 -08:00
|
|
|
ecore_x_kill(bd->client.win);
|
|
|
|
ecore_x_sync();
|
2004-11-24 19:37:45 -08:00
|
|
|
// ecore_x_window_del(bd->client.win);
|
2005-01-15 07:21:57 -08:00
|
|
|
e_border_hide(bd);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_object_del(E_OBJECT(bd));
|
2004-12-22 07:50:26 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2004-12-20 13:33:31 -08:00
|
|
|
else if (!strcmp(source, "shade_up") || !strcmp(source, "shade"))
|
2004-12-09 05:56:06 -08:00
|
|
|
{
|
2004-12-20 13:33:31 -08:00
|
|
|
if (bd->shaded) e_border_unshade(bd, E_DIRECTION_UP);
|
|
|
|
else e_border_shade(bd, E_DIRECTION_UP);
|
|
|
|
}
|
|
|
|
else if (!strcmp(source, "shade_down"))
|
|
|
|
{
|
|
|
|
if (bd->shaded) e_border_unshade(bd, E_DIRECTION_DOWN);
|
|
|
|
else e_border_shade(bd, E_DIRECTION_DOWN);
|
|
|
|
}
|
|
|
|
else if (!strcmp(source, "shade_left"))
|
|
|
|
{
|
|
|
|
if (bd->shaded) e_border_unshade(bd, E_DIRECTION_LEFT);
|
|
|
|
else e_border_shade(bd, E_DIRECTION_LEFT);
|
|
|
|
}
|
|
|
|
else if (!strcmp(source, "shade_right"))
|
|
|
|
{
|
|
|
|
if (bd->shaded) e_border_unshade(bd, E_DIRECTION_RIGHT);
|
|
|
|
else e_border_shade(bd, E_DIRECTION_RIGHT);
|
2004-12-09 05:56:06 -08:00
|
|
|
}
|
2004-12-17 21:47:08 -08:00
|
|
|
else if (!strcmp(source, "maximize"))
|
|
|
|
{
|
|
|
|
if (bd->maximized) e_border_unmaximize(bd);
|
|
|
|
else e_border_maximize(bd);
|
|
|
|
}
|
2004-12-20 13:33:31 -08:00
|
|
|
else if (!strcmp(source, "iconify"))
|
2004-12-17 21:47:08 -08:00
|
|
|
{
|
2004-12-20 19:01:19 -08:00
|
|
|
if (bd->iconic) e_border_uniconify(bd);
|
2004-12-20 13:33:31 -08:00
|
|
|
else e_border_iconify(bd);
|
2004-12-17 21:47:08 -08:00
|
|
|
}
|
2004-12-22 07:50:26 -08:00
|
|
|
else if (!strcmp(source, "menu"))
|
|
|
|
{
|
|
|
|
Evas_Coord x, y;
|
2005-01-12 01:35:07 -08:00
|
|
|
|
2004-12-22 07:50:26 -08:00
|
|
|
evas_pointer_canvas_xy_get(bd->bg_evas , &x, &y);
|
|
|
|
_e_border_menu_show(bd, x + bd->x, y + bd->y);
|
|
|
|
}
|
2004-12-17 21:47:08 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_in(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_In *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
bd = data;
|
2005-01-04 22:56:57 -08:00
|
|
|
#ifdef INOUTDEBUG
|
|
|
|
{
|
|
|
|
time_t t;
|
|
|
|
char *ct;
|
|
|
|
|
|
|
|
const char *modes[] = {
|
|
|
|
"MODE_NORMAL",
|
|
|
|
"MODE_WHILE_GRABBED",
|
|
|
|
"MODE_GRAB",
|
|
|
|
"MODE_UNGRAB"
|
|
|
|
};
|
|
|
|
const char *details[] = {
|
|
|
|
"DETAIL_ANCESTOR",
|
|
|
|
"DETAIL_VIRTUAL",
|
|
|
|
"DETAIL_INFERIOR",
|
|
|
|
"DETAIL_NON_LINEAR",
|
|
|
|
"DETAIL_NON_LINEAR_VIRTUAL",
|
|
|
|
"DETAIL_POINTER",
|
|
|
|
"DETAIL_POINTER_ROOT",
|
|
|
|
"DETAIL_DETAIL_NONE"
|
|
|
|
};
|
|
|
|
t = time(NULL);
|
|
|
|
ct = ctime(&t);
|
|
|
|
ct[strlen(ct) - 1] = 0;
|
|
|
|
printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n",
|
|
|
|
ev->win, ev->event_win,
|
|
|
|
ct,
|
|
|
|
modes[ev->mode],
|
|
|
|
details[ev->detail]);
|
|
|
|
}
|
|
|
|
#endif
|
2004-11-25 06:57:48 -08:00
|
|
|
// if (ev->mode == ECORE_X_EVENT_MODE_GRAB) return 1;
|
2004-11-25 07:32:36 -08:00
|
|
|
// if (ev->mode == ECORE_X_EVENT_MODE_UNGRAB) return 1;
|
2004-11-25 06:57:48 -08:00
|
|
|
// if (ev->mode == ECORE_X_EVENT_MODE_WHILE_GRABBED) return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ev->event_win == bd->win)
|
|
|
|
{
|
|
|
|
/* FIXME: this would normally put focus on the client on pointer */
|
|
|
|
/* focus - but click to focus it wouldnt */
|
2004-11-25 07:32:36 -08:00
|
|
|
e_border_focus_set(bd, 1, 1);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (ev->win != bd->event_win) return 1;
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
2004-12-13 19:32:25 -08:00
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
|
|
|
evas_event_feed_mouse_in(bd->bg_evas, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_out(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Out *ev;
|
|
|
|
E_Border *bd;
|
2004-11-25 06:57:48 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
|
|
|
bd = data;
|
2005-01-04 22:56:57 -08:00
|
|
|
#ifdef INOUTDEBUG
|
2004-11-25 06:57:48 -08:00
|
|
|
{
|
2005-01-04 22:56:57 -08:00
|
|
|
time_t t;
|
|
|
|
char *ct;
|
|
|
|
|
2004-11-25 06:57:48 -08:00
|
|
|
const char *modes[] = {
|
2005-01-04 22:56:57 -08:00
|
|
|
"MODE_NORMAL",
|
|
|
|
"MODE_WHILE_GRABBED",
|
|
|
|
"MODE_GRAB",
|
|
|
|
"MODE_UNGRAB"
|
2004-11-25 06:57:48 -08:00
|
|
|
};
|
|
|
|
const char *details[] = {
|
2005-01-04 22:56:57 -08:00
|
|
|
"DETAIL_ANCESTOR",
|
|
|
|
"DETAIL_VIRTUAL",
|
|
|
|
"DETAIL_INFERIOR",
|
|
|
|
"DETAIL_NON_LINEAR",
|
|
|
|
"DETAIL_NON_LINEAR_VIRTUAL",
|
|
|
|
"DETAIL_POINTER",
|
|
|
|
"DETAIL_POINTER_ROOT",
|
|
|
|
"DETAIL_DETAIL_NONE"
|
2004-11-25 06:57:48 -08:00
|
|
|
};
|
2005-01-04 22:56:57 -08:00
|
|
|
t = time(NULL);
|
|
|
|
ct = ctime(&t);
|
|
|
|
ct[strlen(ct) - 1] = 0;
|
|
|
|
printf("@@ <-OUT 0x%x 0x%x %s md=%s dt=%s\n",
|
|
|
|
ev->win, ev->event_win,
|
|
|
|
ct,
|
2004-11-25 06:57:48 -08:00
|
|
|
modes[ev->mode],
|
|
|
|
details[ev->detail]);
|
2005-01-04 22:56:57 -08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
/* FIXME: this would normally take focus away in pointer focus mode */
|
|
|
|
// if (ev->mode == ECORE_X_EVENT_MODE_UNGRAB) return 1;
|
|
|
|
// if (ev->mode == ECORE_X_EVENT_MODE_WHILE_GRABBED) return 1;
|
|
|
|
if (ev->event_win == bd->win)
|
|
|
|
{
|
2004-12-25 05:13:36 -08:00
|
|
|
if ((ev->mode == ECORE_X_EVENT_MODE_UNGRAB) &&
|
|
|
|
(ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR))
|
|
|
|
return 1;
|
2004-12-25 05:22:16 -08:00
|
|
|
/* this is the out for pointer focus
|
2004-12-25 05:13:36 -08:00
|
|
|
if ((ev->mode == ECORE_X_EVENT_MODE_NORMAL) &&
|
|
|
|
(ev->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL))
|
|
|
|
return 1;
|
2004-12-25 05:22:16 -08:00
|
|
|
*/
|
2004-12-25 05:13:36 -08:00
|
|
|
if (ev->mode == ECORE_X_EVENT_MODE_GRAB)
|
|
|
|
return 1;
|
|
|
|
e_border_focus_set(bd, 0, 1);
|
2004-11-25 06:57:48 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ev->win != bd->event_win) return 1;
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
2004-12-13 19:32:25 -08:00
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
|
|
|
evas_event_feed_mouse_out(bd->bg_evas, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_down(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Down *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
bd = data;
|
2004-12-03 19:55:23 -08:00
|
|
|
if (ev->event_win == bd->win)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("GRABPRESS!\n");
|
2004-12-03 19:55:23 -08:00
|
|
|
if ((ev->button >= 1) && (ev->button <= 3))
|
|
|
|
{
|
|
|
|
bd->mouse.last_down[ev->button - 1].mx = ev->root.x;
|
|
|
|
bd->mouse.last_down[ev->button - 1].my = ev->root.y;
|
|
|
|
bd->mouse.last_down[ev->button - 1].x = bd->x;
|
|
|
|
bd->mouse.last_down[ev->button - 1].y = bd->y;
|
|
|
|
bd->mouse.last_down[ev->button - 1].w = bd->w;
|
|
|
|
bd->mouse.last_down[ev->button - 1].h = bd->h;
|
|
|
|
}
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
|
|
|
/* FIXME: decide that this is a button binding and what to do */
|
|
|
|
if (ev->button == 1)
|
|
|
|
{
|
|
|
|
if (!bd->moving)
|
|
|
|
{
|
|
|
|
bd->moving = 1;
|
|
|
|
_e_border_moveinfo_gather(bd, "mouse,1");
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ev->win != bd->event_win) return 1;
|
|
|
|
if ((ev->button >= 1) && (ev->button <= 3))
|
|
|
|
{
|
|
|
|
bd->mouse.last_down[ev->button - 1].mx = ev->root.x;
|
|
|
|
bd->mouse.last_down[ev->button - 1].my = ev->root.y;
|
|
|
|
bd->mouse.last_down[ev->button - 1].x = bd->x;
|
|
|
|
bd->mouse.last_down[ev->button - 1].y = bd->y;
|
|
|
|
bd->mouse.last_down[ev->button - 1].w = bd->w;
|
|
|
|
bd->mouse.last_down[ev->button - 1].h = bd->h;
|
|
|
|
}
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-12-13 19:32:25 -08:00
|
|
|
Evas_Button_Flags flags = EVAS_BUTTON_NONE;
|
|
|
|
|
|
|
|
if (ev->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
|
|
|
|
if (ev->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
|
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
|
|
|
evas_event_feed_mouse_down(bd->bg_evas, ev->button, flags, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_up(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Up *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
bd = data;
|
2004-12-03 19:55:23 -08:00
|
|
|
if (ev->event_win == bd->win)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("GRABRELEASE!\n");
|
2004-12-03 19:55:23 -08:00
|
|
|
if ((ev->button >= 1) && (ev->button <= 3))
|
|
|
|
{
|
|
|
|
bd->mouse.last_up[ev->button - 1].mx = ev->root.x;
|
|
|
|
bd->mouse.last_up[ev->button - 1].my = ev->root.y;
|
|
|
|
bd->mouse.last_up[ev->button - 1].x = bd->x;
|
|
|
|
bd->mouse.last_up[ev->button - 1].y = bd->y;
|
|
|
|
}
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
|
|
|
/* FIXME: decide that this is a button binding and what to do */
|
|
|
|
if (ev->button == 1)
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
bd->moving = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ev->win != bd->event_win) return 1;
|
|
|
|
if ((ev->button >= 1) && (ev->button <= 3))
|
|
|
|
{
|
|
|
|
bd->mouse.last_up[ev->button - 1].mx = ev->root.x;
|
|
|
|
bd->mouse.last_up[ev->button - 1].my = ev->root.y;
|
|
|
|
bd->mouse.last_up[ev->button - 1].x = bd->x;
|
|
|
|
bd->mouse.last_up[ev->button - 1].y = bd->y;
|
|
|
|
}
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
2004-12-13 19:32:25 -08:00
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
|
|
|
evas_event_feed_mouse_up(bd->bg_evas, ev->button, EVAS_BUTTON_NONE, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_move(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Move *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
bd = data;
|
2004-12-03 19:55:23 -08:00
|
|
|
if (ev->event_win == bd->win)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("GRABMOVE2!\n");
|
2004-12-03 19:55:23 -08:00
|
|
|
}
|
|
|
|
if ((ev->win != bd->event_win) &&
|
|
|
|
(ev->event_win != bd->win)) return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
int x, y, new_x, new_y;
|
|
|
|
Evas_List *skiplist = NULL;
|
|
|
|
|
|
|
|
if ((bd->moveinfo.down.button >= 1) && (bd->moveinfo.down.button <= 3))
|
|
|
|
{
|
|
|
|
x = bd->mouse.last_down[bd->moveinfo.down.button - 1].x +
|
|
|
|
(bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
y = bd->mouse.last_down[bd->moveinfo.down.button - 1].y +
|
|
|
|
(bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
x = bd->x +
|
|
|
|
(bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
y = bd->y +
|
|
|
|
(bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
}
|
|
|
|
new_x = x;
|
|
|
|
new_y = y;
|
|
|
|
skiplist = evas_list_append(skiplist, bd);
|
|
|
|
e_resist_container_position(bd->container, skiplist,
|
|
|
|
bd->x, bd->y, bd->w, bd->h,
|
|
|
|
x, y, bd->w, bd->h,
|
|
|
|
&new_x, &new_y);
|
|
|
|
evas_list_free(skiplist);
|
|
|
|
e_border_move(bd, new_x, new_y);
|
2005-01-10 14:24:23 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (bd->resize_mode != RESIZE_NONE)
|
|
|
|
{
|
|
|
|
_e_border_resize_handle(bd);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-12-13 19:32:25 -08:00
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_cb_mouse_wheel(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Wheel *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
bd = data;
|
|
|
|
if (ev->win != bd->event_win) return 1;
|
|
|
|
bd->mouse.current.mx = ev->root.x;
|
|
|
|
bd->mouse.current.my = ev->root.y;
|
2004-12-13 19:32:25 -08:00
|
|
|
evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, NULL);
|
|
|
|
evas_event_feed_mouse_wheel(bd->bg_evas, ev->direction, ev->z, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2004-12-03 19:55:23 -08:00
|
|
|
static int
|
|
|
|
_e_border_cb_grab_replay(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
if (type == ECORE_X_EVENT_MOUSE_BUTTON_DOWN)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Down *e;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
e = event;
|
|
|
|
bd = e_border_find_by_client_window(e->win);
|
|
|
|
if (!bd) bd = e_border_find_by_client_window(e->event_win);
|
|
|
|
/* FIXME: return 1 if we pass this click on... */
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static void
|
|
|
|
_e_border_eval(E_Border *bd)
|
|
|
|
{
|
|
|
|
/* FIXME: get min/max/start size etc. gravity etc. */
|
|
|
|
|
|
|
|
/* fetch any info queued to be fetched */
|
|
|
|
if (bd->client.icccm.fetch.title)
|
|
|
|
{
|
|
|
|
if (bd->client.icccm.title) free(bd->client.icccm.title);
|
|
|
|
bd->client.icccm.title = ecore_x_icccm_title_get(bd->client.win);
|
|
|
|
bd->client.icccm.fetch.title = 0;
|
|
|
|
if (bd->bg_object)
|
|
|
|
{
|
|
|
|
edje_object_part_text_set(bd->bg_object, "title_text",
|
|
|
|
bd->client.icccm.title);
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("SET TITLE %s\n", bd->client.icccm.title);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.name_class)
|
|
|
|
{
|
2004-12-02 02:07:51 -08:00
|
|
|
int nc_change = 0;
|
|
|
|
char *pname, *pclass;
|
|
|
|
|
|
|
|
pname = bd->client.icccm.name;
|
|
|
|
pclass = bd->client.icccm.class;
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.icccm.name = NULL;
|
|
|
|
bd->client.icccm.class = NULL;
|
|
|
|
ecore_x_window_prop_name_class_get(bd->client.win, &bd->client.icccm.name, &bd->client.icccm.class);
|
2004-12-02 02:07:51 -08:00
|
|
|
if ((pname) && (bd->client.icccm.name) &&
|
|
|
|
(pclass) && (bd->client.icccm.class))
|
|
|
|
{
|
|
|
|
if (!((!strcmp(bd->client.icccm.name, pname)) &&
|
|
|
|
(!strcmp(bd->client.icccm.class, pclass))))
|
|
|
|
nc_change = 1;
|
|
|
|
}
|
|
|
|
else if (((!pname) || (!pclass)) &&
|
|
|
|
((bd->client.icccm.name) || (bd->client.icccm.class)))
|
|
|
|
nc_change = 1;
|
|
|
|
else if (((bd->client.icccm.name) || (bd->client.icccm.class)) &&
|
|
|
|
((!pname) || (!pclass)))
|
|
|
|
nc_change = 1;
|
|
|
|
if (pname) free(pname);
|
|
|
|
if (pclass) free(pclass);
|
|
|
|
if (nc_change)
|
|
|
|
{
|
|
|
|
E_App *a;
|
|
|
|
|
|
|
|
a = NULL;
|
|
|
|
if (bd->icon_object)
|
|
|
|
{
|
|
|
|
evas_object_del(bd->icon_object);
|
|
|
|
bd->icon_object = NULL;
|
|
|
|
}
|
|
|
|
if ((bd->client.icccm.name) && (bd->client.icccm.class))
|
|
|
|
{
|
|
|
|
a = e_app_window_name_class_find(bd->client.icccm.name,
|
|
|
|
bd->client.icccm.class);
|
|
|
|
if (a)
|
|
|
|
{
|
|
|
|
bd->icon_object = edje_object_add(bd->bg_evas);
|
|
|
|
edje_object_file_set(bd->icon_object, a->path, "icon");
|
|
|
|
if (bd->bg_object)
|
|
|
|
{
|
|
|
|
evas_object_show(bd->icon_object);
|
|
|
|
edje_object_part_swallow(bd->bg_object, "icon_swallow", bd->icon_object);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_hide(bd->icon_object);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.icccm.fetch.name_class = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.icon_name)
|
|
|
|
{
|
|
|
|
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
|
|
|
|
bd->client.icccm.icon_name = ecore_x_window_prop_icon_name_get(bd->client.win);
|
|
|
|
bd->client.icccm.fetch.icon_name = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.machine)
|
|
|
|
{
|
|
|
|
if (bd->client.icccm.machine) free(bd->client.icccm.machine);
|
|
|
|
bd->client.icccm.machine = ecore_x_window_prop_client_machine_get(bd->client.win);
|
|
|
|
bd->client.icccm.fetch.machine = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.hints)
|
|
|
|
{
|
|
|
|
int accepts_focus = 1;
|
|
|
|
int is_urgent = 0;
|
|
|
|
|
|
|
|
bd->client.icccm.initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
|
2004-11-28 23:40:06 -08:00
|
|
|
if (ecore_x_icccm_hints_get(bd->client.win,
|
|
|
|
&accepts_focus,
|
|
|
|
&bd->client.icccm.initial_state,
|
|
|
|
&bd->client.icccm.icon_pixmap,
|
|
|
|
&bd->client.icccm.icon_mask,
|
|
|
|
&bd->client.icccm.icon_window,
|
|
|
|
&bd->client.icccm.window_group,
|
|
|
|
&is_urgent))
|
|
|
|
{
|
|
|
|
bd->client.icccm.accepts_focus = accepts_focus;
|
|
|
|
bd->client.icccm.urgent = is_urgent;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.icccm.fetch.hints = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.size_pos_hints)
|
|
|
|
{
|
|
|
|
int request_pos = 0;
|
|
|
|
|
2004-11-28 23:40:06 -08:00
|
|
|
if (ecore_x_icccm_size_pos_hints_get(bd->client.win,
|
|
|
|
&request_pos,
|
|
|
|
&bd->client.icccm.gravity,
|
|
|
|
&bd->client.icccm.min_w,
|
|
|
|
&bd->client.icccm.min_h,
|
|
|
|
&bd->client.icccm.max_w,
|
|
|
|
&bd->client.icccm.max_h,
|
|
|
|
&bd->client.icccm.base_w,
|
|
|
|
&bd->client.icccm.base_h,
|
|
|
|
&bd->client.icccm.step_w,
|
|
|
|
&bd->client.icccm.step_h,
|
|
|
|
&bd->client.icccm.min_aspect,
|
|
|
|
&bd->client.icccm.max_aspect))
|
|
|
|
{
|
|
|
|
bd->client.icccm.request_pos = request_pos;
|
|
|
|
}
|
|
|
|
else
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- NO SIZE HINTS!\n");
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (bd->client.icccm.min_w > 32767) bd->client.icccm.min_w = 32767;
|
|
|
|
if (bd->client.icccm.min_h > 32767) bd->client.icccm.min_h = 32767;
|
|
|
|
if (bd->client.icccm.max_w > 32767) bd->client.icccm.max_w = 32767;
|
|
|
|
if (bd->client.icccm.max_h > 32767) bd->client.icccm.max_h = 32767;
|
|
|
|
if (bd->client.icccm.base_w > 32767) bd->client.icccm.base_w = 32767;
|
|
|
|
if (bd->client.icccm.base_h > 32767) bd->client.icccm.base_h = 32767;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- SIZE HINTS for 0x%x: min %ix%i, max %ix%i, base %ix%i\n",
|
|
|
|
bd->client.win,
|
|
|
|
bd->client.icccm.min_w, bd->client.icccm.min_h,
|
|
|
|
bd->client.icccm.max_w, bd->client.icccm.max_h,
|
|
|
|
bd->client.icccm.base_w, bd->client.icccm.base_h);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.icccm.fetch.size_pos_hints = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.icccm.fetch.protocol)
|
|
|
|
{
|
|
|
|
int i, num;
|
|
|
|
Ecore_X_WM_Protocol *proto;
|
|
|
|
|
|
|
|
proto = ecore_x_window_prop_protocol_list_get(bd->client.win, &num);
|
|
|
|
if (proto)
|
|
|
|
{
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
if (proto[i] == ECORE_X_WM_PROTOCOL_DELETE_REQUEST)
|
|
|
|
bd->client.icccm.delete_request = 1;
|
|
|
|
if (proto[i] == ECORE_X_WM_PROTOCOL_TAKE_FOCUS)
|
|
|
|
bd->client.icccm.take_focus = 1;
|
|
|
|
}
|
|
|
|
free(proto);
|
|
|
|
}
|
|
|
|
bd->client.icccm.fetch.protocol = 0;
|
|
|
|
}
|
2004-11-25 06:09:49 -08:00
|
|
|
if (bd->client.mwm.fetch.hints)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
int pb;
|
|
|
|
|
2004-11-25 06:09:49 -08:00
|
|
|
bd->client.mwm.exists =
|
|
|
|
ecore_x_mwm_hints_get(bd->client.win,
|
|
|
|
&bd->client.mwm.func,
|
|
|
|
&bd->client.mwm.decor,
|
|
|
|
&bd->client.mwm.input);
|
2004-11-24 19:37:45 -08:00
|
|
|
pb = bd->client.mwm.borderless;
|
2004-11-25 06:09:49 -08:00
|
|
|
bd->client.mwm.borderless = 0;
|
|
|
|
if (bd->client.mwm.exists)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- MWM HINTS SET 0x%x!\n");
|
2004-11-25 06:09:49 -08:00
|
|
|
if ((!(bd->client.mwm.decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
|
|
|
|
(!(bd->client.mwm.decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
|
|
|
|
(!(bd->client.mwm.decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
|
2004-11-25 06:57:48 -08:00
|
|
|
bd->client.mwm.borderless = 1;
|
2004-11-25 06:09:49 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
if (bd->client.mwm.borderless != pb)
|
|
|
|
{
|
|
|
|
if (bd->client.border.name) free(bd->client.border.name);
|
|
|
|
if (bd->client.mwm.borderless)
|
|
|
|
bd->client.border.name = strdup("borderless");
|
|
|
|
else
|
|
|
|
bd->client.border.name = strdup("default");
|
2004-11-25 06:09:49 -08:00
|
|
|
if (bd->client.mwm.borderless)
|
|
|
|
printf("client %s borderless\n", bd->client.icccm.title);
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->client.border.changed = 1;
|
|
|
|
}
|
2004-11-25 06:09:49 -08:00
|
|
|
bd->client.mwm.fetch.hints = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (bd->client.netwm.fetch.pid)
|
|
|
|
{
|
|
|
|
bd->client.netwm.pid = ecore_x_window_prop_pid_get(bd->client.win);
|
|
|
|
bd->client.netwm.fetch.pid = 0;
|
|
|
|
}
|
|
|
|
if (bd->client.netwm.fetch.desktop)
|
|
|
|
{
|
|
|
|
bd->client.netwm.desktop = ecore_x_window_prop_desktop_get(bd->client.win);
|
|
|
|
bd->client.netwm.fetch.desktop = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bd->client.border.changed)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
2004-11-28 06:52:56 -08:00
|
|
|
const char *path;
|
2004-11-24 19:37:45 -08:00
|
|
|
char buf[4096];
|
2004-11-28 06:52:56 -08:00
|
|
|
Evas_Coord cx, cy, cw, ch;
|
|
|
|
int l, r, t, b;
|
2004-11-28 22:12:29 -08:00
|
|
|
int ok;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
if (!bd->client.border.name)
|
|
|
|
{
|
|
|
|
bd->client.border.name = strdup("default");
|
|
|
|
}
|
|
|
|
if (bd->bg_object)
|
|
|
|
{
|
|
|
|
bd->w -= (bd->client_inset.l + bd->client_inset.r);
|
|
|
|
bd->h -= (bd->client_inset.t + bd->client_inset.b);
|
|
|
|
bd->client_inset.l = 0;
|
|
|
|
bd->client_inset.r = 0;
|
|
|
|
bd->client_inset.t = 0;
|
|
|
|
bd->client_inset.b = 0;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
evas_object_del(bd->bg_object);
|
|
|
|
}
|
|
|
|
o = edje_object_add(bd->bg_evas);
|
|
|
|
bd->bg_object = o;
|
|
|
|
/* FIXME: "default.eet" needs to come from conf */
|
|
|
|
path = e_path_find(path_themes, "default.eet");
|
|
|
|
snprintf(buf, sizeof(buf), "widgets/border/%s/border",
|
|
|
|
bd->client.border.name);
|
2004-11-28 22:12:29 -08:00
|
|
|
ok = edje_object_file_set(o, path, buf);
|
|
|
|
if (ok)
|
|
|
|
{
|
|
|
|
edje_object_part_text_set(o, "title_text",
|
|
|
|
bd->client.icccm.title);
|
2005-01-06 01:08:20 -08:00
|
|
|
// printf("SET TITLE2 %s\n", bd->client.icccm.title);
|
2004-11-28 22:12:29 -08:00
|
|
|
evas_object_resize(o, 1000, 1000);
|
|
|
|
edje_object_calc_force(o);
|
|
|
|
edje_object_part_geometry_get(o, "client", &cx, &cy, &cw, &ch);
|
|
|
|
l = cx;
|
|
|
|
r = 1000 - (cx + cw);
|
|
|
|
t = cy;
|
|
|
|
b = 1000 - (cy + ch);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
l = 0;
|
|
|
|
r = 0;
|
|
|
|
t = 0;
|
|
|
|
b = 0;
|
|
|
|
}
|
2004-11-28 06:52:56 -08:00
|
|
|
bd->client_inset.l = l;
|
|
|
|
bd->client_inset.r = r;
|
|
|
|
bd->client_inset.t = t;
|
|
|
|
bd->client_inset.b = b;
|
2005-01-12 23:19:03 -08:00
|
|
|
ecore_x_netwm_frame_size_set(bd->client.win, l, r, t, b);
|
2004-11-28 06:52:56 -08:00
|
|
|
bd->w += (bd->client_inset.l + bd->client_inset.r);
|
|
|
|
bd->h += (bd->client_inset.t + bd->client_inset.b);
|
|
|
|
bd->changes.size = 1;
|
|
|
|
ecore_x_window_move(bd->client.shell_win, l, t);
|
2004-11-24 19:37:45 -08:00
|
|
|
edje_object_signal_callback_add(o, "move_start", "*",
|
|
|
|
_e_border_cb_signal_move_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "move_stop", "*",
|
|
|
|
_e_border_cb_signal_move_stop, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_tl_start", "*",
|
|
|
|
_e_border_cb_signal_resize_tl_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_t_start", "*",
|
|
|
|
_e_border_cb_signal_resize_t_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_tr_start", "*",
|
|
|
|
_e_border_cb_signal_resize_tr_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_r_start", "*",
|
|
|
|
_e_border_cb_signal_resize_r_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_br_start", "*",
|
|
|
|
_e_border_cb_signal_resize_br_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_b_start", "*",
|
|
|
|
_e_border_cb_signal_resize_b_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_bl_start", "*",
|
|
|
|
_e_border_cb_signal_resize_bl_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_l_start", "*",
|
|
|
|
_e_border_cb_signal_resize_l_start, bd);
|
|
|
|
edje_object_signal_callback_add(o, "resize_stop", "*",
|
|
|
|
_e_border_cb_signal_resize_stop, bd);
|
|
|
|
edje_object_signal_callback_add(o, "action", "*",
|
|
|
|
_e_border_cb_signal_action, bd);
|
|
|
|
if (bd->focused)
|
|
|
|
edje_object_signal_emit(bd->bg_object, "active", "");
|
|
|
|
evas_object_move(o, 0, 0);
|
|
|
|
evas_object_resize(o, bd->w, bd->h);
|
|
|
|
evas_object_show(o);
|
|
|
|
bd->client.border.changed = 0;
|
2004-12-02 02:07:51 -08:00
|
|
|
|
|
|
|
if (bd->icon_object)
|
|
|
|
{
|
|
|
|
if (bd->bg_object)
|
|
|
|
{
|
|
|
|
evas_object_show(bd->icon_object);
|
|
|
|
edje_object_part_swallow(bd->bg_object, "icon_swallow", bd->icon_object);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_hide(bd->icon_object);
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bd->new_client)
|
|
|
|
{
|
2005-01-15 06:04:13 -08:00
|
|
|
E_Event_Border_Add *ev;
|
|
|
|
|
2005-01-12 22:08:07 -08:00
|
|
|
bd->new_client = 0;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- NEW CLIENT SETUP 0x%x\n", bd->client.win);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (bd->re_manage)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- REMANAGE!\n");
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->x -= bd->client_inset.l;
|
|
|
|
bd->y -= bd->client_inset.t;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->client.icccm.request_pos)
|
|
|
|
{
|
|
|
|
Ecore_X_Window_Attributes *att;
|
|
|
|
int bw;
|
|
|
|
|
|
|
|
att = &bd->client.initial_attributes;
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- REQUEST POS 0x%x [%i,%i]\n",
|
|
|
|
bd->client.win, att->x, att->y);
|
2004-11-24 19:37:45 -08:00
|
|
|
bw = att->border * 2;
|
|
|
|
switch (bd->client.icccm.gravity)
|
|
|
|
{
|
|
|
|
case ECORE_X_GRAVITY_N:
|
|
|
|
bd->x = (att->x - (bw / 2));
|
|
|
|
bd->y = att->y;
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_NE:
|
|
|
|
bd->x = (att->x - (bw)) - (bd->client_inset.l);
|
|
|
|
bd->y = att->y;
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_E:
|
|
|
|
bd->x = (att->x - (bw)) - (bd->client_inset.l);
|
|
|
|
bd->y = (att->y - (bw / 2));
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_SE:
|
|
|
|
bd->x = (att->x - (bw)) - (bd->client_inset.l);
|
|
|
|
bd->y = (att->y - (bw)) - (bd->client_inset.t);
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_S:
|
|
|
|
bd->x = (att->x - (bw / 2));
|
|
|
|
bd->y = (att->y - (bw)) - (bd->client_inset.t);
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_SW:
|
|
|
|
bd->x = att->x;
|
|
|
|
bd->y = (att->y - (bw)) - (bd->client_inset.t);
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_W:
|
|
|
|
bd->x = att->x;
|
|
|
|
bd->y = (att->y - (bw)) - (bd->client_inset.t);
|
|
|
|
break;
|
|
|
|
case ECORE_X_GRAVITY_NW:
|
|
|
|
default:
|
|
|
|
bd->x = att->x;
|
|
|
|
bd->y = att->y;
|
|
|
|
}
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Evas_List *skiplist = NULL;
|
|
|
|
int new_x, new_y;
|
|
|
|
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- AUTO POS 0x%x\n", bd->client.win);
|
2005-01-03 01:34:24 -08:00
|
|
|
if (bd->zone->w > bd->w)
|
2005-01-11 05:11:12 -08:00
|
|
|
new_x = bd->zone->x + (rand() % (bd->zone->w - bd->w));
|
2004-12-09 19:32:35 -08:00
|
|
|
else
|
2005-01-11 05:11:12 -08:00
|
|
|
new_x = bd->zone->x;
|
2005-01-03 01:34:24 -08:00
|
|
|
if (bd->zone->h > bd->h)
|
2005-01-11 05:11:12 -08:00
|
|
|
new_y = bd->zone->y + (rand() % (bd->zone->h - bd->h));
|
2004-12-09 19:32:35 -08:00
|
|
|
else
|
2005-01-11 05:11:12 -08:00
|
|
|
new_y = bd->zone->y;
|
2004-12-10 20:02:26 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
skiplist = evas_list_append(skiplist, bd);
|
2005-01-11 05:11:12 -08:00
|
|
|
e_place_zone_region_smart(bd->zone, skiplist,
|
|
|
|
bd->x, bd->y, bd->w, bd->h,
|
|
|
|
&new_x, &new_y);
|
2004-11-24 19:37:45 -08:00
|
|
|
evas_list_free(skiplist);
|
|
|
|
bd->x = new_x;
|
|
|
|
bd->y = new_y;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
}
|
2005-01-12 22:08:07 -08:00
|
|
|
while (bd->pending_move_resize)
|
|
|
|
{
|
|
|
|
E_Border_Pending_Move_Resize *pnd;
|
|
|
|
|
|
|
|
pnd = bd->pending_move_resize->data;
|
|
|
|
if (pnd->move)
|
|
|
|
{
|
2005-01-12 22:44:19 -08:00
|
|
|
bd->x = pnd->x;
|
|
|
|
bd->y = pnd->y;
|
2005-01-12 22:08:07 -08:00
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
if (pnd->resize)
|
|
|
|
{
|
|
|
|
bd->w = pnd->w + bd->client_inset.l + bd->client_inset.r;
|
|
|
|
bd->h = pnd->h + bd->client_inset.t + bd->client_inset.b;
|
|
|
|
bd->client.w = pnd->w;
|
|
|
|
bd->client.h = pnd->h;
|
|
|
|
bd->changes.size = 1;
|
|
|
|
}
|
|
|
|
free(pnd);
|
|
|
|
bd->pending_move_resize = evas_list_remove_list(bd->pending_move_resize, bd->pending_move_resize);
|
|
|
|
}
|
2005-01-06 01:08:20 -08:00
|
|
|
ecore_x_icccm_move_resize_send(bd->client.win,
|
|
|
|
bd->x + bd->client_inset.l,
|
|
|
|
bd->y + bd->client_inset.t,
|
|
|
|
bd->client.w,
|
|
|
|
bd->client.h);
|
2005-01-15 06:04:13 -08:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Add));
|
|
|
|
ev->border = bd;
|
|
|
|
/* SUSPICION: does the unref for this actually sometimes not get */
|
|
|
|
/* called? coudl this be the dangling borders issue? */
|
|
|
|
e_object_ref(E_OBJECT(bd));
|
|
|
|
ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* effect changes to the window border itself */
|
|
|
|
if (bd->changes.visible)
|
|
|
|
{
|
|
|
|
if (bd->visible) ecore_x_window_show(bd->win);
|
|
|
|
else ecore_x_window_hide(bd->win);
|
|
|
|
bd->changes.visible = 0;
|
|
|
|
}
|
2004-12-10 20:02:26 -08:00
|
|
|
|
2004-12-18 14:26:21 -08:00
|
|
|
if ((bd->changes.shading))
|
|
|
|
{
|
|
|
|
/* show at start of unshade (but don't hide until end of shade) */
|
|
|
|
if (bd->shaded) ecore_x_window_show(bd->client.shell_win);
|
2004-12-20 13:33:31 -08:00
|
|
|
bd->changes.shading = 0;
|
2004-12-18 14:26:21 -08:00
|
|
|
}
|
2004-12-10 20:02:26 -08:00
|
|
|
if ((bd->changes.shaded) && (bd->changes.pos) && (bd->changes.size))
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
ecore_x_window_hide(bd->client.shell_win);
|
|
|
|
else
|
|
|
|
ecore_x_window_show(bd->client.shell_win);
|
|
|
|
bd->changes.shaded = 0;
|
|
|
|
}
|
|
|
|
else if ((bd->changes.shaded) && (bd->changes.pos))
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
ecore_x_window_hide(bd->client.shell_win);
|
|
|
|
else
|
|
|
|
ecore_x_window_show(bd->client.shell_win);
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changes.shaded = 0;
|
|
|
|
}
|
|
|
|
else if ((bd->changes.shaded) && (bd->changes.size))
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
ecore_x_window_hide(bd->client.shell_win);
|
|
|
|
else
|
|
|
|
ecore_x_window_show(bd->client.shell_win);
|
|
|
|
bd->changes.shaded = 0;
|
|
|
|
}
|
|
|
|
else if (bd->changes.shaded)
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
ecore_x_window_hide(bd->client.shell_win);
|
|
|
|
else
|
|
|
|
ecore_x_window_show(bd->client.shell_win);
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changes.shaded = 0;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((bd->changes.pos) && (bd->changes.size))
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- BORDER NEEDS POS/SIZE CHANGE 0x%x\n", bd->client.win);
|
2004-12-20 13:33:31 -08:00
|
|
|
if (bd->shaded && !bd->shading)
|
2004-12-10 20:02:26 -08:00
|
|
|
{
|
|
|
|
evas_obscured_clear(bd->bg_evas);
|
|
|
|
ecore_x_window_move_resize(bd->win, bd->x, bd->y, bd->w, bd->h);
|
|
|
|
ecore_x_window_move_resize(bd->event_win, 0, 0, bd->w, bd->h);
|
|
|
|
ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
|
|
|
|
evas_object_resize(bd->bg_object, bd->w, bd->h);
|
|
|
|
e_container_shape_resize(bd->shape, bd->w, bd->h);
|
|
|
|
e_container_shape_move(bd->shape, bd->x, bd->y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_obscured_clear(bd->bg_evas);
|
|
|
|
evas_obscured_rectangle_add(bd->bg_evas,
|
|
|
|
bd->client_inset.l, bd->client_inset.t,
|
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r),
|
|
|
|
bd->h - (bd->client_inset.t + bd->client_inset.b));
|
|
|
|
ecore_x_window_move_resize(bd->win, bd->x, bd->y, bd->w, bd->h);
|
|
|
|
ecore_x_window_move_resize(bd->event_win, 0, 0, bd->w, bd->h);
|
|
|
|
ecore_x_window_move_resize(bd->client.shell_win,
|
|
|
|
bd->client_inset.l, bd->client_inset.t,
|
2004-12-20 13:33:31 -08:00
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r),
|
|
|
|
bd->h - (bd->client_inset.t + bd->client_inset.b));
|
2004-12-20 19:01:19 -08:00
|
|
|
if (bd->shading)
|
|
|
|
{
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP)
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0,
|
|
|
|
bd->h - (bd->client_inset.t + bd->client_inset.b) -
|
|
|
|
bd->client.h,
|
|
|
|
bd->client.w, bd->client.h);
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
ecore_x_window_move_resize(bd->client.win,
|
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r) -
|
|
|
|
bd->client.h,
|
|
|
|
0, bd->client.w, bd->client.h);
|
|
|
|
else
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0, 0,
|
|
|
|
bd->client.w, bd->client.h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0, 0,
|
|
|
|
bd->client.w, bd->client.h);
|
2004-12-10 20:02:26 -08:00
|
|
|
ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
|
|
|
|
evas_object_resize(bd->bg_object, bd->w, bd->h);
|
|
|
|
e_container_shape_resize(bd->shape, bd->w, bd->h);
|
|
|
|
e_container_shape_move(bd->shape, bd->x, bd->y);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->changes.pos = 0;
|
|
|
|
bd->changes.size = 0;
|
|
|
|
}
|
|
|
|
else if (bd->changes.pos)
|
|
|
|
{
|
|
|
|
ecore_x_window_move(bd->win, bd->x, bd->y);
|
|
|
|
e_container_shape_move(bd->shape, bd->x, bd->y);
|
|
|
|
bd->changes.pos = 0;
|
|
|
|
}
|
|
|
|
else if (bd->changes.size)
|
|
|
|
{
|
2005-01-06 01:08:20 -08:00
|
|
|
printf("##- BORDER NEEDS SIZE CHANGE 0x%x\n", bd->client.win);
|
2004-12-20 13:33:31 -08:00
|
|
|
if (bd->shaded && !bd->shading)
|
2004-12-10 20:02:26 -08:00
|
|
|
{
|
|
|
|
evas_obscured_clear(bd->bg_evas);
|
|
|
|
ecore_x_window_move_resize(bd->event_win, 0, 0, bd->w, bd->h);
|
|
|
|
ecore_x_window_resize(bd->win, bd->w, bd->h);
|
|
|
|
ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
|
|
|
|
evas_object_resize(bd->bg_object, bd->w, bd->h);
|
|
|
|
e_container_shape_resize(bd->shape, bd->w, bd->h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_obscured_clear(bd->bg_evas);
|
|
|
|
evas_obscured_rectangle_add(bd->bg_evas,
|
|
|
|
bd->client_inset.l, bd->client_inset.t,
|
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r), bd->h - (bd->client_inset.t + bd->client_inset.b));
|
|
|
|
ecore_x_window_move_resize(bd->event_win, 0, 0, bd->w, bd->h);
|
|
|
|
ecore_x_window_resize(bd->win, bd->w, bd->h);
|
|
|
|
ecore_x_window_move_resize(bd->client.shell_win,
|
|
|
|
bd->client_inset.l, bd->client_inset.t,
|
2004-12-20 13:33:31 -08:00
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r),
|
|
|
|
bd->h - (bd->client_inset.t + bd->client_inset.b));
|
2004-12-20 19:01:19 -08:00
|
|
|
if (bd->shading)
|
|
|
|
{
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP)
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0,
|
|
|
|
bd->h - (bd->client_inset.t + bd->client_inset.b) -
|
|
|
|
bd->client.h,
|
|
|
|
bd->client.w, bd->client.h);
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
ecore_x_window_move_resize(bd->client.win,
|
|
|
|
bd->w - (bd->client_inset.l + bd->client_inset.r) -
|
|
|
|
bd->client.h,
|
|
|
|
0, bd->client.w, bd->client.h);
|
|
|
|
else
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0, 0,
|
|
|
|
bd->client.w, bd->client.h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_move_resize(bd->client.win, 0, 0,
|
|
|
|
bd->client.w, bd->client.h);
|
2004-12-10 20:02:26 -08:00
|
|
|
ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
|
|
|
|
evas_object_resize(bd->bg_object, bd->w, bd->h);
|
|
|
|
e_container_shape_resize(bd->shape, bd->w, bd->h);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
bd->changes.size = 0;
|
|
|
|
}
|
2004-12-09 05:56:06 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (bd->changes.reset_gravity)
|
|
|
|
{
|
|
|
|
GRAV_SET(bd, ECORE_X_GRAVITY_NW);
|
|
|
|
bd->changes.reset_gravity = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bd->changed = 0;
|
|
|
|
|
|
|
|
bd->changes.stack = 0;
|
|
|
|
bd->changes.prop = 0;
|
|
|
|
bd->changes.border = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_resize_limit(E_Border *bd, int *w, int *h)
|
|
|
|
{
|
|
|
|
double a;
|
|
|
|
|
|
|
|
*w -= bd->client_inset.l + bd->client_inset.r;
|
|
|
|
*h -= bd->client_inset.t + bd->client_inset.b;
|
|
|
|
if (*h < 1) *h = 1;
|
|
|
|
if (*w < 1) *w = 1;
|
2004-11-25 22:15:02 -08:00
|
|
|
a = (double)*w / (double)*h;
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((bd->client.icccm.min_aspect != 0.0) &&
|
|
|
|
(a < bd->client.icccm.min_aspect))
|
2004-11-25 22:15:02 -08:00
|
|
|
*w = *h * bd->client.icccm.min_aspect;
|
2004-11-24 19:37:45 -08:00
|
|
|
else if
|
|
|
|
((bd->client.icccm.max_aspect != 0.0) &&
|
|
|
|
(a > bd->client.icccm.max_aspect))
|
2004-11-25 22:15:02 -08:00
|
|
|
*h = *w / bd->client.icccm.max_aspect;
|
2004-11-24 19:37:45 -08:00
|
|
|
*w = bd->client.icccm.base_w +
|
|
|
|
(((*w - bd->client.icccm.base_w) / bd->client.icccm.step_w) *
|
|
|
|
bd->client.icccm.step_w);
|
|
|
|
*h = bd->client.icccm.base_h +
|
|
|
|
(((*h - bd->client.icccm.base_h) / bd->client.icccm.step_h) *
|
|
|
|
bd->client.icccm.step_h);
|
2004-11-25 22:15:02 -08:00
|
|
|
|
|
|
|
if (*h < 1) *h = 1;
|
|
|
|
if (*w < 1) *w = 1;
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (*w > bd->client.icccm.max_w) *w = bd->client.icccm.max_w;
|
|
|
|
else if (*w < bd->client.icccm.min_w) *w = bd->client.icccm.min_w;
|
|
|
|
if (*h > bd->client.icccm.max_h) *h = bd->client.icccm.max_h;
|
|
|
|
else if (*h < bd->client.icccm.min_h) *h = bd->client.icccm.min_h;
|
|
|
|
|
|
|
|
*w += bd->client_inset.l + bd->client_inset.r;
|
|
|
|
*h += bd->client_inset.t + bd->client_inset.b;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_moveinfo_gather(E_Border *bd, const char *source)
|
|
|
|
{
|
|
|
|
if (!strcmp(source, "mouse,1")) bd->moveinfo.down.button = 1;
|
|
|
|
else if (!strcmp(source, "mouse,2")) bd->moveinfo.down.button = 2;
|
|
|
|
else if (!strcmp(source, "mouse,3")) bd->moveinfo.down.button = 3;
|
|
|
|
else bd->moveinfo.down.button = 0;
|
|
|
|
if ((bd->moveinfo.down.button >= 1) && (bd->moveinfo.down.button <= 3))
|
|
|
|
{
|
|
|
|
bd->moveinfo.down.mx = bd->mouse.last_down[bd->moveinfo.down.button - 1].mx;
|
|
|
|
bd->moveinfo.down.my = bd->mouse.last_down[bd->moveinfo.down.button - 1].my;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bd->moveinfo.down.mx = bd->mouse.current.mx;
|
|
|
|
bd->moveinfo.down.my = bd->mouse.current.my;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_resize_handle(E_Border *bd)
|
|
|
|
{
|
|
|
|
int x, y, w, h;
|
|
|
|
int tw, th;
|
|
|
|
|
|
|
|
x = bd->x;
|
|
|
|
y = bd->y;
|
|
|
|
w = bd->w;
|
|
|
|
h = bd->h;
|
|
|
|
|
|
|
|
if ((bd->resize_mode == RESIZE_TR) ||
|
|
|
|
(bd->resize_mode == RESIZE_R) ||
|
|
|
|
(bd->resize_mode == RESIZE_BR))
|
|
|
|
{
|
|
|
|
if ((bd->moveinfo.down.button >= 1) &&
|
|
|
|
(bd->moveinfo.down.button <= 3))
|
|
|
|
w = bd->mouse.last_down[bd->moveinfo.down.button - 1].w +
|
|
|
|
(bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
else
|
|
|
|
w = bd->w + (bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
}
|
|
|
|
else if ((bd->resize_mode == RESIZE_TL) ||
|
|
|
|
(bd->resize_mode == RESIZE_L) ||
|
|
|
|
(bd->resize_mode == RESIZE_BL))
|
|
|
|
{
|
|
|
|
if ((bd->moveinfo.down.button >= 1) &&
|
|
|
|
(bd->moveinfo.down.button <= 3))
|
|
|
|
w = bd->mouse.last_down[bd->moveinfo.down.button - 1].w -
|
|
|
|
(bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
else
|
|
|
|
w = bd->w - (bd->mouse.current.mx - bd->moveinfo.down.mx);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((bd->resize_mode == RESIZE_TL) ||
|
|
|
|
(bd->resize_mode == RESIZE_T) ||
|
|
|
|
(bd->resize_mode == RESIZE_TR))
|
|
|
|
{
|
|
|
|
if ((bd->moveinfo.down.button >= 1) &&
|
|
|
|
(bd->moveinfo.down.button <= 3))
|
|
|
|
h = bd->mouse.last_down[bd->moveinfo.down.button - 1].h -
|
|
|
|
(bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
else
|
|
|
|
h = bd->h - (bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
}
|
|
|
|
else if ((bd->resize_mode == RESIZE_BL) ||
|
|
|
|
(bd->resize_mode == RESIZE_B) ||
|
|
|
|
(bd->resize_mode == RESIZE_BR))
|
|
|
|
{
|
|
|
|
if ((bd->moveinfo.down.button >= 1) &&
|
|
|
|
(bd->moveinfo.down.button <= 3))
|
|
|
|
h = bd->mouse.last_down[bd->moveinfo.down.button - 1].h +
|
|
|
|
(bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
else
|
|
|
|
h = bd->h + (bd->mouse.current.my - bd->moveinfo.down.my);
|
|
|
|
}
|
|
|
|
|
|
|
|
tw = bd->w;
|
|
|
|
th = bd->h;
|
|
|
|
_e_border_resize_limit(bd, &w, &h);
|
|
|
|
|
|
|
|
if ((bd->resize_mode == RESIZE_TL) ||
|
|
|
|
(bd->resize_mode == RESIZE_L) ||
|
|
|
|
(bd->resize_mode == RESIZE_BL))
|
|
|
|
x += (tw - w);
|
|
|
|
if ((bd->resize_mode == RESIZE_TL) ||
|
|
|
|
(bd->resize_mode == RESIZE_T) ||
|
|
|
|
(bd->resize_mode == RESIZE_TR))
|
|
|
|
y += (th - h);
|
|
|
|
|
|
|
|
e_border_move_resize(bd, x, y, w, h);
|
|
|
|
}
|
2004-12-18 14:26:21 -08:00
|
|
|
|
|
|
|
static int
|
|
|
|
_e_border_shade_animator(void *data)
|
|
|
|
{
|
|
|
|
E_Border *bd = data;
|
2004-12-18 15:24:09 -08:00
|
|
|
double dt, val;
|
|
|
|
double dur = bd->client.h / e_config->border_shade_speed;
|
2004-12-18 14:26:21 -08:00
|
|
|
|
|
|
|
dt = ecore_time_get() - bd->shade.start;
|
2004-12-20 13:33:31 -08:00
|
|
|
val = dt / dur;
|
2004-12-18 14:26:21 -08:00
|
|
|
|
2004-12-18 15:24:09 -08:00
|
|
|
if (val < 0.0) val = 0.0;
|
|
|
|
else if (val > 1.0) val = 1.0;
|
2004-12-18 14:26:21 -08:00
|
|
|
|
2004-12-20 13:33:31 -08:00
|
|
|
if (e_config->border_shade_transition == E_TRANSITION_SINUSOIDAL)
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
bd->shade.val = (1 - cos(val * M_PI)) / 2.0;
|
|
|
|
else
|
|
|
|
bd->shade.val = 0.5 + (cos(val * M_PI) / 2.0);
|
|
|
|
}
|
|
|
|
else if (e_config->border_shade_transition == E_TRANSITION_DECELERATE)
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
bd->shade.val = sin(val * M_PI / 2.0);
|
|
|
|
else
|
|
|
|
bd->shade.val = 1 - sin(val * M_PI / 2.0);
|
|
|
|
}
|
|
|
|
else if (e_config->border_shade_transition == E_TRANSITION_ACCELERATE)
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
bd->shade.val = 1 - cos(val * M_PI / 2.0);
|
|
|
|
else
|
|
|
|
bd->shade.val = cos(val * M_PI / 2.0);
|
|
|
|
}
|
|
|
|
else /* LINEAR if none of the others */
|
|
|
|
{
|
|
|
|
if (bd->shaded)
|
|
|
|
bd->shade.val = val;
|
|
|
|
else
|
|
|
|
bd->shade.val = 1 - val;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* due to M_PI's innacuracy, cos(M_PI/2) != 0.0, so we need this */
|
|
|
|
if (bd->shade.val < 0.001) bd->shade.val = 0.0;
|
|
|
|
else if (bd->shade.val > .999) bd->shade.val = 1.0;
|
|
|
|
|
|
|
|
if (bd->shade.dir == E_DIRECTION_UP)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client_inset.b + bd->client.h * bd->shade.val;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_DOWN)
|
|
|
|
{
|
|
|
|
bd->h = bd->client_inset.t + bd->client_inset.b + bd->client.h * bd->shade.val;
|
|
|
|
bd->y = bd->shade.y + bd->client.h * (1 - bd->shade.val);
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_LEFT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client_inset.r + bd->client.w * bd->shade.val;
|
|
|
|
}
|
|
|
|
else if (bd->shade.dir == E_DIRECTION_RIGHT)
|
|
|
|
{
|
|
|
|
bd->w = bd->client_inset.l + bd->client_inset.r + bd->client.w * bd->shade.val;
|
|
|
|
bd->x = bd->shade.x + bd->client.w * (1 - bd->shade.val);
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
}
|
2004-12-18 14:26:21 -08:00
|
|
|
|
|
|
|
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
2004-12-18 15:24:09 -08:00
|
|
|
/* we're done */
|
2004-12-18 14:26:21 -08:00
|
|
|
if ( (bd->shaded && (bd->shade.val == 1)) ||
|
|
|
|
(!(bd->shaded) && (bd->shade.val == 0)) )
|
|
|
|
{
|
2005-01-16 21:39:18 -08:00
|
|
|
E_Event_Border_Resize *ev;
|
|
|
|
|
2004-12-18 14:26:21 -08:00
|
|
|
bd->shading = 0;
|
|
|
|
bd->shaded = !(bd->shaded);
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changes.shaded = 1;
|
|
|
|
bd->changes.shading = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
|
|
|
|
if (bd->shaded)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(bd->bg_object, "shaded", "");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(bd->bg_object, "unshaded", "");
|
|
|
|
}
|
2004-12-18 20:18:13 -08:00
|
|
|
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_NW);
|
2005-01-16 21:39:18 -08:00
|
|
|
ev = calloc(1, sizeof(E_Event_Border_Resize));
|
|
|
|
ev->border = bd;
|
|
|
|
e_object_ref(E_OBJECT(bd));
|
|
|
|
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
|
2004-12-18 14:26:21 -08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-01-12 01:35:07 -08:00
|
|
|
static void
|
|
|
|
_e_border_cb_border_menu_end(void *data, E_Menu *m)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = e_object_data_get(E_OBJECT(m));
|
|
|
|
if (bd) bd->border_menu = NULL;
|
|
|
|
e_object_del(E_OBJECT(m));
|
|
|
|
}
|
2004-12-22 07:50:26 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
|
|
|
E_App *a;
|
|
|
|
|
2005-01-12 01:35:07 -08:00
|
|
|
if (bd->border_menu) return;
|
2004-12-22 20:58:57 -08:00
|
|
|
|
2005-01-12 01:35:07 -08:00
|
|
|
m = e_menu_new();
|
|
|
|
e_object_data_set(E_OBJECT(m), bd);
|
2005-01-12 08:03:09 -08:00
|
|
|
bd->border_menu = m;
|
2005-01-12 01:35:07 -08:00
|
|
|
e_menu_post_deactivate_callback_set(m, _e_border_cb_border_menu_end, NULL);
|
2004-12-22 20:58:57 -08:00
|
|
|
|
2004-12-22 07:50:26 -08:00
|
|
|
mi = e_menu_item_new(m);
|
|
|
|
e_menu_item_label_set(mi, "Close");
|
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_close, bd);
|
|
|
|
|
|
|
|
mi = e_menu_item_new(m);
|
|
|
|
e_menu_item_label_set(mi, "Iconify");
|
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_iconify, bd);
|
2005-01-10 16:52:25 -08:00
|
|
|
|
2004-12-22 07:50:26 -08:00
|
|
|
mi = e_menu_item_new(m);
|
2005-01-10 16:52:25 -08:00
|
|
|
e_menu_item_separator_set(mi, 1);
|
|
|
|
|
|
|
|
mi = e_menu_item_new(m);
|
2005-01-10 18:47:27 -08:00
|
|
|
e_menu_item_label_set(mi, "Shaded");
|
2005-01-10 16:52:25 -08:00
|
|
|
e_menu_item_check_set(mi, 1);
|
|
|
|
e_menu_item_toggle_set(mi, (bd->shaded ? 1 : 0));
|
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_shade, bd);
|
|
|
|
|
|
|
|
mi = e_menu_item_new(m);
|
2005-01-10 18:47:27 -08:00
|
|
|
e_menu_item_label_set(mi, "Maximized");
|
2005-01-10 16:52:25 -08:00
|
|
|
e_menu_item_check_set(mi, 1);
|
|
|
|
e_menu_item_toggle_set(mi, (bd->maximized ? 1 : 0));
|
2004-12-22 07:50:26 -08:00
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_maximize, bd);
|
|
|
|
|
2005-01-07 23:10:13 -08:00
|
|
|
mi = e_menu_item_new(m);
|
2005-01-10 18:47:27 -08:00
|
|
|
e_menu_item_label_set(mi, "Sticky");
|
2005-01-10 16:52:25 -08:00
|
|
|
e_menu_item_check_set(mi, 1);
|
|
|
|
e_menu_item_toggle_set(mi, (bd->sticky ? 1 : 0));
|
2005-01-07 23:10:13 -08:00
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_stick, bd);
|
|
|
|
|
2004-12-22 07:50:26 -08:00
|
|
|
mi = e_menu_item_new(m);
|
|
|
|
e_menu_item_separator_set(mi, 1);
|
|
|
|
|
|
|
|
a = e_app_window_name_class_find(bd->client.icccm.name,
|
|
|
|
bd->client.icccm.class);
|
|
|
|
|
|
|
|
if (a)
|
|
|
|
{
|
|
|
|
mi = e_menu_item_new(m);
|
|
|
|
e_menu_item_label_set(mi, "Edit Icon");
|
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_icon_edit, a->path);
|
|
|
|
}
|
2005-01-07 12:29:45 -08:00
|
|
|
else if (bd->client.icccm.class) /* icons with no class useless to borders */
|
2004-12-22 07:50:26 -08:00
|
|
|
{
|
2004-12-23 03:39:08 -08:00
|
|
|
static char buf[PATH_MAX + 50];
|
|
|
|
char *name, *homedir;
|
2004-12-25 21:04:03 -08:00
|
|
|
int i, l;
|
2004-12-23 03:39:08 -08:00
|
|
|
|
|
|
|
buf[0] = '\0';
|
|
|
|
/* generate a reasonable file name from the window class */
|
|
|
|
/* FIXME - I think there could be duplicates - how better to do this? */
|
|
|
|
name = strdup(bd->client.icccm.class);
|
2004-12-25 21:04:03 -08:00
|
|
|
l = strlen(name);
|
|
|
|
for (i = 0; i < l; i++)
|
2004-12-23 03:39:08 -08:00
|
|
|
{
|
2005-01-07 12:29:45 -08:00
|
|
|
if (name[i] == ' ') name[i] = '_';
|
2004-12-23 03:39:08 -08:00
|
|
|
}
|
|
|
|
/* previously this could be null, but it will exist now */
|
|
|
|
homedir = e_user_homedir_get();
|
|
|
|
|
|
|
|
snprintf(buf, sizeof(buf),
|
|
|
|
"--win-class %s %s/.e/e/applications/all/%s.eapp",
|
|
|
|
bd->client.icccm.class, homedir, name);
|
2005-01-07 12:29:45 -08:00
|
|
|
mi = e_menu_item_new(m);
|
|
|
|
e_menu_item_label_set(mi, "Create Icon");
|
2004-12-23 03:39:08 -08:00
|
|
|
e_menu_item_callback_set(mi, _e_border_menu_cb_icon_edit, buf);
|
2004-12-22 07:50:26 -08:00
|
|
|
}
|
|
|
|
|
2005-01-11 05:43:01 -08:00
|
|
|
e_menu_activate_mouse(m, bd->zone, x, y, 1, 1,
|
2004-12-22 07:50:26 -08:00
|
|
|
E_MENU_POP_DIRECTION_DOWN);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
if (bd->client.icccm.delete_request)
|
|
|
|
ecore_x_window_delete_request_send(bd->client.win);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_x_kill(bd->client.win);
|
|
|
|
ecore_x_sync();
|
|
|
|
// ecore_x_window_del(bd->client.win);
|
2005-01-15 07:21:57 -08:00
|
|
|
e_border_hide(bd);
|
2004-12-22 07:50:26 -08:00
|
|
|
e_object_del(E_OBJECT(bd));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
if (bd->maximized) e_border_uniconify(bd);
|
|
|
|
else e_border_iconify(bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
if (bd->maximized) e_border_unmaximize(bd);
|
|
|
|
else e_border_maximize(bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
if (bd->shaded) e_border_unshade(bd, E_DIRECTION_UP);
|
|
|
|
else e_border_shade(bd, E_DIRECTION_UP);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
char *file;
|
|
|
|
char *command;
|
|
|
|
char *full;
|
|
|
|
Ecore_Exe *process;
|
|
|
|
|
|
|
|
file = data;
|
|
|
|
command = "e_util_eapp_edit ";
|
|
|
|
full = malloc(strlen(file) + strlen(command) + 1);
|
|
|
|
strcpy(full, command);
|
|
|
|
strcat(full, file);
|
2004-12-23 03:39:08 -08:00
|
|
|
printf("EXEC %s\n", full);
|
2004-12-22 07:50:26 -08:00
|
|
|
process = ecore_exe_run(full, NULL);
|
|
|
|
if (!process || !ecore_exe_pid_get(process))
|
|
|
|
e_error_dialog_show("Icon Edit Error", "Error starting icon editor\n\n \
|
|
|
|
please install e_util_eapp_edit\n \
|
|
|
|
or make sure it is in your PATH\n");
|
|
|
|
}
|
2005-01-07 23:10:13 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_menu_cb_stick(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = data;
|
|
|
|
if (bd->sticky) e_border_unstick(bd);
|
|
|
|
else e_border_stick(bd);
|
|
|
|
}
|
2005-01-10 14:24:23 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_event_border_resize_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
E_Event_Border_Resize *e;
|
|
|
|
|
|
|
|
e = ev;
|
2005-01-11 00:00:05 -08:00
|
|
|
e_object_unref(E_OBJECT(e->border));
|
2005-01-10 14:24:23 -08:00
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_event_border_move_free(void *data, void *ev)
|
|
|
|
{
|
2005-01-14 06:01:08 -08:00
|
|
|
E_Event_Border_Move *e;
|
2005-01-10 14:24:23 -08:00
|
|
|
|
|
|
|
e = ev;
|
2005-01-11 00:00:05 -08:00
|
|
|
e_object_unref(E_OBJECT(e->border));
|
2005-01-10 14:24:23 -08:00
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
2005-01-10 16:04:46 -08:00
|
|
|
static void
|
|
|
|
_e_border_event_border_add_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
E_Event_Border_Add *e;
|
|
|
|
|
|
|
|
e = ev;
|
2005-01-11 00:00:05 -08:00
|
|
|
e_object_unref(E_OBJECT(e->border));
|
2005-01-10 16:04:46 -08:00
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_event_border_remove_free(void *data, void *ev)
|
|
|
|
{
|
2005-01-14 06:01:08 -08:00
|
|
|
E_Event_Border_Remove *e;
|
2005-01-10 16:04:46 -08:00
|
|
|
|
|
|
|
e = ev;
|
2005-01-11 00:11:30 -08:00
|
|
|
e_object_unref(E_OBJECT(e->border));
|
2005-01-10 16:04:46 -08:00
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
2005-01-11 00:00:05 -08:00
|
|
|
static void
|
|
|
|
_e_border_event_border_show_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
E_Event_Border_Show *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
e_object_unref(E_OBJECT(e->border));
|
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_event_border_hide_free(void *data, void *ev)
|
|
|
|
{
|
2005-01-14 06:01:08 -08:00
|
|
|
E_Event_Border_Hide *e;
|
2005-01-11 00:00:05 -08:00
|
|
|
|
|
|
|
e = ev;
|
|
|
|
e_object_unref(E_OBJECT(e->border));
|
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_border_event_border_desk_set_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
E_Event_Border_Desk_Set *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
e_object_unref(E_OBJECT(e->border));
|
|
|
|
e_object_unref(E_OBJECT(e->desk));
|
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
2005-01-11 05:11:12 -08:00
|
|
|
static void
|
|
|
|
_e_border_zone_update(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
/* still within old zone - leave it there */
|
|
|
|
if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
|
|
|
|
bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h))
|
|
|
|
return;
|
|
|
|
/* find a new zone */
|
|
|
|
con = bd->zone->container;
|
|
|
|
for (l = con->zones; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = l->data;
|
|
|
|
if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
|
|
|
|
zone->x, zone->y, zone->w, zone->h))
|
|
|
|
{
|
|
|
|
bd->zone = zone;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|