bool CinderInteractItem::mouseDown(ci::app::MouseEvent mouse_event) { if(detect_selection_) { bool select = detect_click_selection(mouse_event); if (draggable_ && select) { drag_in_progress_ = true; drag_start(mouse_event); } } return false; }
static gboolean motion_notify_cb (CeditNotebook *notebook, GdkEventMotion *event, gpointer data) { CeditNotebook *dest; gint page_num; gint result; if (notebook->priv->drag_in_progress == FALSE) { if (notebook->priv->tab_drag_and_drop_enabled == FALSE) return FALSE; if (gtk_drag_check_threshold (GTK_WIDGET (notebook), notebook->priv->x_start, notebook->priv->y_start, event->x_root, event->y_root)) { drag_start (notebook, event->time); return TRUE; } return FALSE; } result = find_notebook_and_tab_at_pos ((gint)event->x_root, (gint)event->y_root, &dest, &page_num); if (result != NOT_IN_APP_WINDOWS) { if (dest != notebook) { move_current_tab_to_another_notebook (notebook, dest, event, page_num); } else { g_return_val_if_fail (page_num >= -1, FALSE); move_current_tab (notebook, page_num); } } return FALSE; }
static void move_current_tab_to_another_notebook (CeditNotebook *src, CeditNotebook *dest, GdkEventMotion *event, gint dest_position) { CeditTab *tab; gint cur_page; /* This is getting tricky, the tab was dragged in a notebook * in another window of the same app, we move the tab * to that new notebook, and let this notebook handle the * drag */ g_return_if_fail (CEDIT_IS_NOTEBOOK (dest)); g_return_if_fail (dest != src); cur_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (src)); tab = CEDIT_TAB (gtk_notebook_get_nth_page (GTK_NOTEBOOK (src), cur_page)); /* stop drag in origin window */ /* ungrab the pointer if it's grabbed */ drag_stop (src); if (gdk_pointer_is_grabbed ()) { gdk_pointer_ungrab (event->time); } gtk_grab_remove (GTK_WIDGET (src)); cedit_notebook_move_tab (src, dest, tab, dest_position); /* start drag handling in dest notebook */ dest->priv->motion_notify_handler_id = g_signal_connect (G_OBJECT (dest), "motion-notify-event", G_CALLBACK (motion_notify_cb), NULL); drag_start (dest, event->time); }
bool ewmh_handle_event(XEvent *ev) { client *c; int i, j, xo, yo; long extents[4]; Atom rt; int rf; unsigned long nir, bar; switch(ev->type) { case ClientMessage: c = owner(ev->xclient.window); if(ev->xclient.message_type == ewmh_atoms[NET_WM_MOVERESIZE]) { if(c) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_WM_MOVERESIZE\n"); #endif if(ev->xclient.data.l[2] == NET_WM_MOVERESIZE_MOVE || ev->xclient.data.l[2] == NET_WM_MOVERESIZE_MOVE_KEYBOARD) { client_focus(c, true); xo = client_width_total_intern(c) / 2; yo = client_height_total_intern(c) / 2; XWarpPointer(dpy, None, c->parent, 0, 0, 0, 0, xo, yo); drag_start(A_MOVE, AnyButton, client_x(c) + xo, client_y(c) + yo); } if(ev->xclient.data.l[2] == NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT || ev->xclient.data.l[2] == NET_WM_MOVERESIZE_SIZE_KEYBOARD) { client_focus(c, true); drag_start(A_RESIZE, AnyButton, ev->xclient.data.l[0], ev->xclient.data.l[1]); } } return true; } if(ev->xclient.message_type == ewmh_atoms[NET_CLOSE_WINDOW]) { if(c) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_CLOSE_WINDOW\n"); #endif delete_window(c); } return true; } if(ev->xclient.message_type == ewmh_atoms[NET_ACTIVE_WINDOW]) { if(c) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_ACTIVE_WINDOW\n"); #endif if(c->flags & ICONIC) client_restore(c); else { if(c->desktop != desktop && c->desktop != STICKY) desktop_goto(c->desktop); client_raise(c); } if(evh != wlist_handle_event) client_focus(c, true); } return true; } if(ev->xclient.message_type == ewmh_atoms[NET_RESTACK_WINDOW]) { if(c && ev->xclient.data.l[1] == None) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_RESTACK_WINDOW\n"); #endif client_raise(c); } /* schould also add code for handling this when a sibling window is passed */ /* but we schould find/create a way to test this first */ return true; } if(ev->xclient.message_type == ewmh_atoms[NET_WM_STATE]) { if(c) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_WM_STATE\n"); #endif j = 0; for(i = 1; i < 3; i++) { if(((Atom) ev->xclient.data.l[i]) == ewmh_atoms[NET_WM_STATE_MAXIMIZED_HORZ]) j |= MAXIMIZED_L | MAXIMIZED_R; if(((Atom) ev->xclient.data.l[i]) == ewmh_atoms[NET_WM_STATE_MAXIMIZED_VERT]) j |= MAXIMIZED_T | MAXIMIZED_B; } if(j) client_toggle_state(c, j); if(((Atom) ev->xclient.data.l[1]) == ewmh_atoms[NET_WM_STATE_FULLSCREEN] && (ev->xclient.data.l[0] == NET_WM_STATE_TOGGLE || (ev->xclient.data.l[0] == NET_WM_STATE_ADD && !(c->flags & FULLSCREEN)) || (ev->xclient.data.l[0] == NET_WM_STATE_REMOVE && (c->flags & FULLSCREEN)))) client_fullscreen(c); if(((Atom) ev->xclient.data.l[1]) == ewmh_atoms[NET_WM_STATE_ABOVE]) { if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_ADD]) client_set_layer(c, TOP); if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_REMOVE] && c->layer == TOP) client_set_layer(c, NORMAL); if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_TOGGLE]) client_set_layer(c, (c->layer == TOP) ? NORMAL : TOP); } if(((Atom) ev->xclient.data.l[1]) == ewmh_atoms[NET_WM_STATE_BELOW]) { if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_ADD]) client_set_layer(c, BOTTOM); if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_REMOVE] && c->layer == BOTTOM) client_set_layer(c, NORMAL); if(((Atom) ev->xclient.data.l[0]) == ewmh_atoms[NET_WM_STATE_TOGGLE]) client_set_layer(c, (c->layer == BOTTOM) ? NORMAL : BOTTOM); } return true; } } if(ev->xclient.message_type == ewmh_atoms[NET_CURRENT_DESKTOP]) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_CURRENT_DESKTOP\n"); #endif desktop_goto(ev->xclient.data.l[0]); return true; } if(ev->xclient.message_type == ewmh_atoms[NET_WM_DESKTOP]) { if(c && ev->xclient.data.l[0] >= STICKY) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_WM_DESKTOP\n"); #endif client_to_desktop(c, (ev->xclient.data.l[0] <= dc) ? ev->xclient.data.l[0] : dc - 1); } return true; } if(ev->xclient.message_type == ewmh_atoms[NET_REQUEST_FRAME_EXTENTS]) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_REQUEST_FRAME_EXTENTS\n"); #endif extents[0] = border_width; extents[1] = border_width; extents[2] = border_width + title_height; extents[3] = border_width; XChangeProperty(dpy, ev->xclient.window, ewmh_atoms[NET_FRAME_EXTENTS], XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &extents, 4); return true; } if(ev->xclient.message_type == ewmh_atoms[NET_SHOWING_DESKTOP]) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling ClientMessage event\n\tatom: _NET_SHOWING_DESKTOP\n"); #endif client_iconify_all(); return true; } break; case PropertyNotify: if(ev->xproperty.atom == ewmh_atoms[NET_WM_STRUT_PARTIAL] || ev->xproperty.atom == ewmh_atoms[NET_WM_STRUT]) { #ifdef DEBUG_EVENTS printf(NAME ": ewmh_handle_event(): handling PropertyNotify event (_NET_WM_STRUT or _NET_WM_STRUT_PARTIAL changed)\n"); #endif ewmh_update_strut(); return true; } c = owner(ev->xproperty.window); if(c && ev->xproperty.atom == ewmh_atoms[NET_WM_NAME]) { if(XGetWindowProperty(dpy, c->window, ewmh_atoms[NET_WM_NAME], 0, 1024, False, xa_utf8_string, &rt, &rf, &nir, &bar, (unsigned char **) &c->ewmh_name) != Success) c->ewmh_name = NULL; else client_update_name(c); return true; } break; } return false; }