From 3fb18e99903c17eadc9b1980efa5db0fcc9b03d9 Mon Sep 17 00:00:00 2001 From: sebastid Date: Mon, 6 Jun 2005 15:22:05 +0000 Subject: [PATCH] netwm sync SVN revision: 15163 --- netwm.txt | 6 +- src/bin/e_border.c | 133 +++++++++++++++++++++++++++++++++++++-------- src/bin/e_border.h | 11 +++- src/bin/e_hints.c | 8 +-- 4 files changed, 127 insertions(+), 31 deletions(-) diff --git a/netwm.txt b/netwm.txt index 9adfa3f6f..1652e8c2d 100644 --- a/netwm.txt +++ b/netwm.txt @@ -87,6 +87,6 @@ _NET_WM_PID [X] _NET_WM_HANDLED_ICONS [T] _NET_WM_USER_TIME [X] _NET_FRAME_EXTENTS [X] -_NET_WM_PING [ ] -_NET_WM_SYNC_REQUEST [ ] -_NET_WM_SYNC_REQUEST_COUNTER [ ] +_NET_WM_PING [X] /* Still need to do action if no ping return */ +_NET_WM_SYNC_REQUEST [X] +_NET_WM_SYNC_REQUEST_COUNTER [X] diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 2907d07d3..a1a46632f 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -38,10 +38,12 @@ 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 int _e_border_cb_window_state_request(void *data, int ev_type, void *ev); static int _e_border_cb_window_move_resize_request(void *data, int ev_type, void *ev); static int _e_border_cb_desktop_change(void *data, int ev_type, void *ev); -static int _e_border_cb_client_message(void *data, int ev_type, void *ev); +static int _e_border_cb_sync_alarm(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); @@ -124,6 +126,8 @@ static E_Border *resize = NULL; static E_Border *move = NULL; static Ecore_Timer *focus_fix_timer = NULL; + +static int grabbed = 0; int E_EVENT_BORDER_ADD = 0; int E_EVENT_BORDER_REMOVE = 0; @@ -165,10 +169,11 @@ e_border_init(void) 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)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, _e_border_cb_window_state_request, NULL)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, _e_border_cb_window_move_resize_request, NULL)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DESKTOP_CHANGE, _e_border_cb_desktop_change, NULL)); - handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_border_cb_client_message, NULL)); + handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_SYNC_ALARM, _e_border_cb_sync_alarm, NULL)); ecore_x_passive_grab_replay_func_set(_e_border_cb_grab_replay, NULL); E_EVENT_BORDER_ADD = ecore_event_type_new(); @@ -596,6 +601,11 @@ e_border_move(E_Border *bd, int x, int y) bd->y = y; bd->changed = 1; bd->changes.pos = 1; + if (bd->client.netwm.sync.request) + { + bd->client.netwm.sync.wait++; + ecore_x_netwm_sync_request_send(bd->client.win, bd->client.netwm.sync.serial++); + } ecore_x_icccm_move_resize_send(bd->client.win, bd->x + bd->client_inset.l, bd->y + bd->client_inset.t, @@ -635,6 +645,11 @@ e_border_resize(E_Border *bd, int w, int h) bd->client.h = bd->h - (bd->client_inset.t + bd->client_inset.b); bd->changed = 1; bd->changes.size = 1; + if (bd->client.netwm.sync.request) + { + bd->client.netwm.sync.wait++; + ecore_x_netwm_sync_request_send(bd->client.win, bd->client.netwm.sync.serial++); + } ecore_x_icccm_move_resize_send(bd->client.win, bd->x + bd->client_inset.l, bd->y + bd->client_inset.t, @@ -680,6 +695,11 @@ e_border_move_resize(E_Border *bd, int x, int y, int w, int h) bd->changed = 1; bd->changes.pos = 1; bd->changes.size = 1; + if (bd->client.netwm.sync.request) + { + bd->client.netwm.sync.wait++; + ecore_x_netwm_sync_request_send(bd->client.win, bd->client.netwm.sync.serial++); + } ecore_x_icccm_move_resize_send(bd->client.win, bd->x + bd->client_inset.l, bd->y + bd->client_inset.t, @@ -1260,6 +1280,23 @@ e_border_find_by_window(Ecore_X_Window win) return NULL; } +E_Border * +e_border_find_by_alarm(Ecore_X_Sync_Alarm alarm) +{ + Evas_List *l; + + for (l = borders; l; l = l->next) + { + E_Border *bd; + + bd = l->data; + if ((bd) && (!e_object_is_del(E_OBJECT(bd))) && + (bd->client.netwm.sync.alarm == alarm)) + return bd; + } + return NULL; +} + E_Border * e_border_focused_get(void) { @@ -2027,6 +2064,10 @@ _e_border_cb_window_property(void *data, int ev_type, void *ev) bd->changed = 1; } */ + else if (e->atom == ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER) + { + printf("ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER\n"); + } return 1; } @@ -2185,6 +2226,18 @@ _e_border_cb_window_focus_out(void *data, int ev_type, void *ev) return 1; } +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; + return 1; +} + static int _e_border_cb_window_state_request(void *data, int ev_type, void *ev) { @@ -2279,7 +2332,7 @@ _e_border_cb_window_move_resize_request(void *data, int ev_type, void *ev) bd->moveinfo.down.button = e->button; bd->moveinfo.down.mx = e->x; bd->moveinfo.down.my = e->y; - bd->grab = 1; + grabbed = 1; e_border_raise(bd); if (e->direction == RESIZE_TL) @@ -2385,14 +2438,16 @@ _e_border_cb_desktop_change(void *data, int ev_type, void *ev) } static int -_e_border_cb_client_message(void *data, int ev_type, void *ev) +_e_border_cb_sync_alarm(void *data, int ev_type, void *ev) { E_Border *bd; - Ecore_X_Event_Client_Message *e; + Ecore_X_Event_Sync_Alarm *e; e = ev; - bd = e_border_find_by_client_window(e->win); + bd = e_border_find_by_alarm(e->alarm); if (!bd) return 1; + bd->client.netwm.sync.wait--; + bd->client.netwm.sync.time = ecore_time_get(); return 1; } @@ -2676,6 +2731,7 @@ _e_border_cb_mouse_in(void *data, int type, void *event) (ev->event_win == bd->win)) return 1; */ + if (grabbed) return 1; if (ev->event_win == bd->win) { /* FIXME: this would normally put focus on the client on pointer */ @@ -2733,6 +2789,7 @@ _e_border_cb_mouse_out(void *data, int type, void *event) #endif /* FIXME: this would normally take focus away in pointer focus mode */ // if (ev->mode == ECORE_X_EVENT_MODE_UNGRAB) return 1; + if (grabbed) return 1; if (ev->event_win == bd->win) { if ((ev->mode == ECORE_X_EVENT_MODE_UNGRAB) && @@ -2918,6 +2975,12 @@ _e_border_cb_mouse_move(void *data, int type, void *event) int new_w, new_h; Evas_List *skiplist = NULL; + if ((ecore_time_get() - bd->client.netwm.sync.time) > 0.5) + bd->client.netwm.sync.wait = 0; + if ((bd->client.netwm.sync.request) && + (bd->client.netwm.sync.alarm) && + (bd->client.netwm.sync.wait > 1)) return 1; + if ((bd->moveinfo.down.button >= 1) && (bd->moveinfo.down.button <= 3)) { x = bd->mouse.last_down[bd->moveinfo.down.button - 1].x + @@ -2945,6 +3008,12 @@ _e_border_cb_mouse_move(void *data, int type, void *event) } else if (bd->resize_mode != RESIZE_NONE) { + if ((ecore_time_get() - bd->client.netwm.sync.time) > 0.5) + bd->client.netwm.sync.wait = 0; + if ((bd->client.netwm.sync.request) && + (bd->client.netwm.sync.alarm) && + (bd->client.netwm.sync.wait > 1)) return 1; + _e_border_resize_handle(bd); } else @@ -3287,21 +3356,17 @@ _e_border_eval(E_Border *bd) for (i = 0; i < num; i++) { if (proto[i] == ECORE_X_WM_PROTOCOL_DELETE_REQUEST) - { - printf("ECORE_X_WM_PROTOCOL_DELETE_REQUEST\n"); - bd->client.icccm.delete_request = 1; - } + bd->client.icccm.delete_request = 1; else if (proto[i] == ECORE_X_WM_PROTOCOL_TAKE_FOCUS) bd->client.icccm.take_focus = 1; else if (proto[i] == ECORE_X_NET_WM_PROTOCOL_PING) - { - printf("ECORE_X_NET_WM_PROTOCOL_PING\n"); - bd->client.netwm.ping = 1; - } + bd->client.netwm.ping = 1; else if (proto[i] == ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST) { - printf("ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST\n"); - bd->client.netwm.sync_request = 1; + bd->client.netwm.sync.request = 1; + if (!ecore_x_netwm_sync_counter_get(bd->client.win, + &bd->client.netwm.sync.counter)) + bd->client.netwm.sync.request = 0; } } free(proto); @@ -4682,8 +4747,15 @@ _e_border_resize_begin(E_Border *bd) w = (bd->client.w - bd->client.icccm.min_w) / bd->client.icccm.step_w; h = (bd->client.h - bd->client.icccm.min_h) / bd->client.icccm.step_h; } - if (bd->grab) + if (grabbed) ecore_x_pointer_grab(bd->win); + if (bd->client.netwm.sync.request) + { + bd->client.netwm.sync.alarm = ecore_x_sync_alarm_new(bd->client.netwm.sync.counter); + bd->client.netwm.sync.serial = 0; + bd->client.netwm.sync.wait = 0; + bd->client.netwm.sync.time = ecore_time_get(); + } e_resize_begin(bd->zone, w, h); resize = bd; } @@ -4691,9 +4763,14 @@ _e_border_resize_begin(E_Border *bd) static void _e_border_resize_end(E_Border *bd) { - if (bd->grab) + if (grabbed) ecore_x_pointer_ungrab(); - bd->grab = 0; + grabbed = 0; + if (bd->client.netwm.sync.alarm) + { + ecore_x_sync_alarm_free(bd->client.netwm.sync.alarm); + bd->client.netwm.sync.alarm = 0; + } e_resize_end(); resize = NULL; } @@ -4720,8 +4797,15 @@ _e_border_resize_update(E_Border *bd) static void _e_border_move_begin(E_Border *bd) { - if (bd->grab) + if (grabbed) ecore_x_pointer_grab(bd->win); + if (bd->client.netwm.sync.request) + { + bd->client.netwm.sync.alarm = ecore_x_sync_alarm_new(bd->client.netwm.sync.counter); + bd->client.netwm.sync.serial = 0; + bd->client.netwm.sync.wait = 0; + bd->client.netwm.sync.time = ecore_time_get(); + } e_move_begin(bd->zone, bd->x, bd->y); move = bd; } @@ -4729,9 +4813,14 @@ _e_border_move_begin(E_Border *bd) static void _e_border_move_end(E_Border *bd) { - if (bd->grab) + if (grabbed) ecore_x_pointer_ungrab(); - bd->grab = 0; + grabbed = 0; + if (bd->client.netwm.sync.alarm) + { + ecore_x_sync_alarm_free(bd->client.netwm.sync.alarm); + bd->client.netwm.sync.alarm = 0; + } e_move_end(); move = NULL; } diff --git a/src/bin/e_border.h b/src/bin/e_border.h index ad5056809..1b7f8c75b 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -184,7 +184,14 @@ struct _E_Border int bottom_end_x; } strut; unsigned char ping : 1; - unsigned char sync_request : 1; + struct { + unsigned char request : 1; + unsigned int wait; + Ecore_X_Sync_Alarm alarm; + Ecore_X_Sync_Counter counter; + unsigned int serial; + double time; + } sync; /* NetWM Window state */ struct { @@ -249,7 +256,6 @@ struct _E_Border unsigned char already_unparented : 1; unsigned char need_reparent : 1; unsigned char button_grabbed : 1; - unsigned char grab : 1; double ping; @@ -418,6 +424,7 @@ EAPI void e_border_unstick(E_Border *bd); EAPI E_Border *e_border_find_by_client_window(Ecore_X_Window win); EAPI E_Border *e_border_find_by_frame_window(Ecore_X_Window win); EAPI E_Border *e_border_find_by_window(Ecore_X_Window win); +EAPI E_Border *e_border_find_by_alarm(Ecore_X_Sync_Alarm alarm); EAPI E_Border *e_border_focused_get(void); EAPI void e_border_idler_before(void); diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index ef0d53f8b..21bae9460 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -17,7 +17,7 @@ e_hints_init(void) for (i = 0; i < num; i++) { Ecore_X_Window win; - Ecore_X_Atom supported[35]; + Ecore_X_Atom supported[38]; int num; win = ecore_x_window_new(roots[i], -200, -200, 5, 5); @@ -112,9 +112,9 @@ e_hints_init(void) /*ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_HANDLED_ICONS, 1);*/ supported[num++] = ECORE_X_ATOM_NET_WM_USER_TIME; supported[num++] = ECORE_X_ATOM_NET_FRAME_EXTENTS; - /*ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_PING, 1);*/ - /*ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_SYNC_REQUEST, 1);*/ - /*ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER, 1);*/ + supported[num++] = ECORE_X_ATOM_NET_WM_PING; + supported[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST; + supported[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER; ecore_x_netwm_supported_set(roots[i], supported, num); } free(roots);