Updating branch refs/heads/master to cf255cb4dffd80d4dea7a5d9a4495d9d2d54009b (commit) from 7ee37205b7cc23156e9d02b1622adaa193a96b2b (commit)
commit cf255cb4dffd80d4dea7a5d9a4495d9d2d54009b Author: Andre Ellguth <an...@ellguth.com> Date: Fri Oct 11 17:39:36 2013 +0200 Disabled the posibilty to drag the dockapp by pressing the ALT key. Enabled motion dragging for smaller dockapps (less than 64 pixels). panel-plugin/catchwindow.c | 5 +- panel-plugin/dockapp.c | 232 ++++++++++++++++++++++---------------------- panel-plugin/dockapp.h | 3 - panel-plugin/rcfile.c | 25 ++--- panel-plugin/rcfile.h | 3 + 5 files changed, 132 insertions(+), 136 deletions(-) diff --git a/panel-plugin/catchwindow.c b/panel-plugin/catchwindow.c index 28559b2..a0926bf 100644 --- a/panel-plugin/catchwindow.c +++ b/panel-plugin/catchwindow.c @@ -232,11 +232,8 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) if( IS_PANELOFF(wmdock) ) { wmdock_order_dockapps(wmdock_get_primary_anchor_dockapp()); - /* Setup the event handler for the window. */ + /* Setup the event-after handler for the window. */ g_signal_connect(G_OBJECT(dapp->tile), "event-after", G_CALLBACK(wmdock_dockapp_event_after_handler), dapp); - g_signal_connect(G_OBJECT(dapp->tile), "motion_notify_event", G_CALLBACK(wmdock_dockapp_motion_notify_handler), dapp); - g_signal_connect(G_OBJECT(dapp->tile), "button_press_event", G_CALLBACK(wmdock_dockapp_button_press_handler), dapp); - g_signal_connect(G_OBJECT(dapp->tile), "button_release_event", G_CALLBACK(wmdock_dockapp_button_release_handler), dapp); } /* Clear the noisy background. */ wmdock_redraw_dockapp(dapp); diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c index e6f4aaa..2f5f448 100644 --- a/panel-plugin/dockapp.c +++ b/panel-plugin/dockapp.c @@ -248,6 +248,95 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp) } +/** + * Event handle for the tile in panel off mode (button_press) + * + * @param tile The window of the event. + * @param ev GdkEventButton. + * @param dapp DockAppNode of the event. + */ +static void wmdock_dockapp_button_press_handler(GtkWidget *window, GdkEventButton *ev, DockappNode *dapp) +{ + debug("dockapp.c: Window button press event (dapp: `%s')", dapp->name); + dappOnMotion = dapp; + motionstartx = (gint) ev->x; + motionstarty = (gint) ev->y; + gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), TRUE); + gtk_window_set_keep_below(GTK_WINDOW(dapp->tile), FALSE); +} + + +/** + * Event handle for the tile in panel off mode (button_release) + * + * @param tile The window of the event. + * @param ev GdkEventButton. + * @param dapp DockAppNode of the event. + */ +static void wmdock_dockapp_button_release_handler(GtkWidget *window, GdkEventButton *ev, DockappNode *dapp) +{ + debug("dockapp.c: Window button release event (dapp: `%s')", dapp->name); + if(wmdock_replace_tile_dummy(dapp) == TRUE) { + debug("dockapp.c: Replaceable dummy tile found."); + wmdock_order_dockapps(wmdock_get_primary_anchor_dockapp() ? wmdock_get_primary_anchor_dockapp() : dapp); + } else { + wmdock_remove_anchors_tile_dummy(); + wmdock_set_autoposition_dockapp(dapp, wmdock_get_parent_dockapp(dapp)); + } + if(dappDummy) { + gtk_widget_hide(dappDummy->tile); + } + + dappOnMotion = NULL; + gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), FALSE); + gtk_window_set_keep_below(GTK_WINDOW(dapp->tile), TRUE); +} + + +/** + * Event handle for the tile in panel off mode (motion_notify) + * + * @param tile The window of the event. + * @param ev GdkEventButton. + * @param dapp DockAppNode of the event. + */ +static void wmdock_dockapp_motion_notify_handler(GtkWidget *window, GdkEventMotion *ev, DockappNode *dapp) +{ + gint gluepos, x, y, posx, posy; + DockappNode *dappSnap = NULL; + GdkModifierType m; + + debug("dockapp.c: Window motion notify event (dapp: `%s')", dapp->name); + + gdk_window_get_pointer(dapp->tile->window, &x, &y, &m); + if(window && dappOnMotion && (m & GDK_BUTTON1_MASK)) { + gtk_window_get_position(GTK_WINDOW(dapp->tile), &posx, &posy); + debug("dockapp.c: Mouse x: %d, Mouse y: %d, Dapp x: %d, Dapp y: %d, Msx: %d, Msy: %d", + x, y, posx, posy, motionstartx, motionstarty); + gtk_window_move(GTK_WINDOW(dapp->tile), posx - (motionstartx - x), posy - (motionstarty - y)); + } + + if(dappOnMotion == dapp) { + wmdock_remove_anchors_tile_dummy(); + dappSnap = wmdock_get_snapable_dockapp(dapp, &gluepos); + if(dappSnap) { + debug("dockapp.c: Snapable dockapp `%s' for dockapp `%s', glue: %d.", dappSnap->name, dapp->name, gluepos); + if(!dappDummy) { + dappDummy = g_new0(DockappNode, 1); + dappDummy->name = g_strdup(DOCKAPP_DUMMY_TITLE); + dappDummy->tile = wmdock_create_tile_dummy(); + } + + dappSnap->glue[gluepos] = dappDummy; + wmdock_order_dockapps(dappDummy); + gtk_widget_show_all(dappDummy->tile); + } else if(dappDummy) { + gtk_widget_hide(dappDummy->tile); + } + } +} + + /* Return the translation from glue int postion to glue name. * * @param gluePos Position to be translated. @@ -342,122 +431,17 @@ DockappNode *wmdock_get_primary_anchor_dockapp() /** - * Event handle for the tile in panel off mode (button_press) - * - * @param tile The window of the event. - * @param ev GdkEventButton. - * @param dapp DockAppNode of the event. - */ -void wmdock_dockapp_button_press_handler(GtkWidget *tile, GdkEventButton *ev, DockappNode *dapp) -{ - debug("dockapp.c: Window button press event (dapp: `%s')", dapp->name); - dappOnMotion = dapp; - motionstartx = (gint) ev->x; - motionstarty = (gint) ev->y; - gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), TRUE); -} - - -/** - * Event handle for the tile in panel off mode (button_release) - * - * @param tile The window of the event. - * @param ev GdkEventButton. - * @param dapp DockAppNode of the event. - */ -void wmdock_dockapp_button_release_handler(GtkWidget *tile, GdkEventButton *ev, DockappNode *dapp) -{ - debug("dockapp.c: Window button release event (dapp: `%s')", dapp->name); - if(wmdock_replace_tile_dummy(dapp) == TRUE) { - debug("dockapp.c: Replaceable dummy tile found."); - wmdock_order_dockapps(wmdock_get_primary_anchor_dockapp() ? wmdock_get_primary_anchor_dockapp() : dapp); - } else { - wmdock_remove_anchors_tile_dummy(); - wmdock_set_autoposition_dockapp(dapp, wmdock_get_parent_dockapp(dapp)); - } - if(dappDummy) { - gtk_widget_hide(dappDummy->tile); - } - - dappOnMotion = NULL; - gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), FALSE); -} - - -/** - * Event handle for the tile in panel off mode (motion_notify) - * - * @param tile The window of the event. - * @param ev GdkEventButton. - * @param dapp DockAppNode of the event. - */ -void wmdock_dockapp_motion_notify_handler(GtkWidget *tile, GdkEventMotion *ev, DockappNode *dapp) -{ - gint gluepos, x, y, posx, posy; - DockappNode *dappSnap = NULL; - GdkModifierType m; - - debug("dockapp.c: Window motion notify event (dapp: `%s')", dapp->name); - - gdk_window_get_pointer(dapp->tile->window, &x, &y, &m); - if(tile && dappOnMotion && (m & GDK_BUTTON1_MASK)) { - gtk_window_get_position(GTK_WINDOW(dapp->tile), &posx, &posy); - debug("dockapp.c: Mouse x: %d, Mouse y: %d, Dapp x: %d, Dapp y: %d, Msx: %d, Msy: %d", - x, y, posx, posy, motionstartx, motionstarty); - gtk_window_move(GTK_WINDOW(dapp->tile), posx - (motionstartx - x), posy - (motionstarty - y)); - } - - if(dappOnMotion == dapp) { - wmdock_remove_anchors_tile_dummy(); - dappSnap = wmdock_get_snapable_dockapp(dapp, &gluepos); - if(dappSnap) { - debug("dockapp.c: Snapable dockapp `%s' for dockapp `%s', glue: %d.", dappSnap->name, dapp->name, gluepos); - if(!dappDummy) { - dappDummy = g_new0(DockappNode, 1); - dappDummy->name = g_strdup(DOCKAPP_DUMMY_TITLE); - dappDummy->tile = wmdock_create_tile_dummy(); - } - - dappSnap->glue[gluepos] = dappDummy; - wmdock_order_dockapps(dappDummy); - gtk_widget_show_all(dappDummy->tile); - } else if(dappDummy) { - gtk_widget_hide(dappDummy->tile); - } - } -} - - - -/** * Event handler for the tile in panel off mode (event_after). * * @param tile The window of the event. * @param ev Event informations. * @param dapp DockappNode of the event. */ -void wmdock_dockapp_event_after_handler(GtkWidget *tile, GdkEvent *ev, DockappNode *dapp) +void wmdock_dockapp_event_after_handler(GtkWidget *window, GdkEvent *ev, DockappNode *dapp) { - GdkModifierType m; - - debug("dockapp.c: Window event after: %d. (dapp: `%s'), dappOnMove: %s", ev->type, dapp->name, + debug("dockapp.c: Window event-after: %d. (dapp: `%s'), dappOnMove: %s", ev->type, dapp->name, dappOnMotion ? "Yes": "No"); switch(ev->type) { - case GDK_CONFIGURE: - gdk_window_get_pointer(tile->window, NULL, NULL, &m); - if(!dappOnMotion && (m & GDK_BUTTON1_MASK)) { - dappOnMotion = dapp; - gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), TRUE); - } - wmdock_dockapp_motion_notify_handler(NULL, &ev->motion, dapp); - - if(!(dappOnMotion && !(m & GDK_BUTTON1_MASK))) - break; - /* No break if DockApp is moved and mouse btn released. */ - case GDK_BUTTON_RELEASE: - case GDK_KEY_RELEASE: - wmdock_dockapp_button_release_handler(NULL, &ev->button, dapp); - break; case GDK_FOCUS_CHANGE: if(ev->focus_change.in == TRUE) { /* `in' is true if window window got the focus. */ @@ -500,7 +484,6 @@ GtkWidget *wmdock_create_tile_dummy() gtk_window_set_skip_pager_hint(GTK_WINDOW(dummy), TRUE); gtk_window_set_opacity(GTK_WINDOW(dummy), 0.6); gtk_widget_set_size_request(dummy, DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); - // gtk_window_set_type_hint(GTK_WINDOW(dummy), GDK_WINDOW_TYPE_HINT_DND); return (dummy); } @@ -516,8 +499,10 @@ void wmdock_dockapp_tofront(DockappNode *dapp) { return; if ( IS_PANELOFF(wmdock) ) { + gtk_window_set_keep_below(GTK_WINDOW(dapp->tile), FALSE); gdk_window_raise(dapp->tile->window); gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), FALSE); + gtk_window_set_keep_below(GTK_WINDOW(dapp->tile), TRUE); } } @@ -814,25 +799,30 @@ void wmdock_set_socket_postion(DockappNode *dapp, int x, int y) GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp) { GtkWidget *tile = NULL; - GtkWidget *fixed = NULL; + GtkWidget *_fixed = NULL; + GtkWidget *_evbox = NULL; + + tile = _fixed = gtk_fixed_new(); + gtk_container_set_border_width(GTK_CONTAINER(_fixed), 0); - tile = fixed = gtk_fixed_new(); - gtk_container_set_border_width(GTK_CONTAINER(fixed), 0); + /* Create an internal eventbox to catch click events outside the socket. */ + _evbox = gtk_event_box_new(); + gtk_widget_set_size_request(GTK_WIDGET(_evbox), DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); + gtk_fixed_put(GTK_FIXED(_fixed), _evbox, 0, 0); - /* Create an eventbox to catch all click and motion events. */ + /* Create an eventbox to catch to click and motion events inside the socket. */ dapp->evbox = gtk_event_box_new(); gtk_event_box_set_above_child(GTK_EVENT_BOX(dapp->evbox), FALSE); /* Add the GtkSocket with the dockapp fixed and centered. */ gtk_container_add(GTK_CONTAINER(dapp->evbox), GTK_WIDGET(dapp->s)); - gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(dapp->evbox), + gtk_fixed_put(GTK_FIXED(_fixed), GTK_WIDGET(dapp->evbox), (DEFAULT_DOCKAPP_WIDTH - dapp->width) / 2, (DEFAULT_DOCKAPP_HEIGHT - dapp->height) / 2); /* Add the background tile. */ dapp->bg = wmdock->propDispTile == TRUE ? gtk_image_new_from_pixbuf(gdkPbTileDefault) : gtk_image_new(); gtk_widget_set_size_request(GTK_WIDGET(dapp->bg), DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); - gtk_fixed_put(GTK_FIXED(fixed), dapp->bg, 0, 0); - + gtk_container_add(GTK_CONTAINER(_evbox), GTK_WIDGET(dapp->bg)); if( IS_PANELOFF(wmdock) ) { /* If propDispPanelOff is true create a separate window with the @@ -844,6 +834,10 @@ GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp) gtk_window_set_title(GTK_WINDOW(tile), dapp->name); gtk_window_set_default_size(GTK_WINDOW(tile), DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); gtk_container_set_border_width(GTK_CONTAINER(tile), 0); + /* To disable dragging by alt key. */ + gtk_window_set_type_hint(GTK_WINDOW(tile), GDK_WINDOW_TYPE_HINT_DOCK); + gtk_window_set_keep_below(GTK_WINDOW(tile), TRUE); + gtk_window_set_keep_above(GTK_WINDOW(tile), FALSE); /* Disable window shrinking resizing and growing. */ gtk_window_set_policy (GTK_WINDOW(tile), FALSE, FALSE, FALSE); @@ -856,10 +850,14 @@ GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp) gtk_window_set_skip_taskbar_hint(GTK_WINDOW(tile), TRUE); gtk_window_set_skip_pager_hint(GTK_WINDOW(tile), TRUE); - gtk_container_add(GTK_CONTAINER(tile), fixed); + gtk_container_add(GTK_CONTAINER(tile), _fixed); + + g_signal_connect(G_OBJECT(tile), "motion_notify_event", G_CALLBACK(wmdock_dockapp_motion_notify_handler), dapp); + g_signal_connect(G_OBJECT(tile), "button_press_event", G_CALLBACK(wmdock_dockapp_button_press_handler), dapp); + g_signal_connect(G_OBJECT(tile), "button_release_event", G_CALLBACK(wmdock_dockapp_button_release_handler), dapp); } - gtk_widget_show(fixed); + gtk_widget_show(_fixed); return (tile); } diff --git a/panel-plugin/dockapp.h b/panel-plugin/dockapp.h index 3873eec..4e5a886 100644 --- a/panel-plugin/dockapp.h +++ b/panel-plugin/dockapp.h @@ -68,9 +68,6 @@ DockappNode *wmdock_get_parent_dockapp(DockappNode *); DockappNode *wmdock_get_primary_anchor_dockapp(); void wmdock_dockapp_tofront(DockappNode *dapp); void wmdock_dockapp_event_after_handler(GtkWidget *, GdkEvent *, DockappNode *); -void wmdock_dockapp_button_press_handler(GtkWidget *, GdkEventButton *, DockappNode *); -void wmdock_dockapp_button_release_handler(GtkWidget *, GdkEventButton *, DockappNode *); -void wmdock_dockapp_motion_notify_handler(GtkWidget *, GdkEventMotion *, DockappNode *); void wmdock_remove_anchor_dockapp(DockappNode *, DockappNode *); void wmdock_order_dockapps(DockappNode *); GtkWidget *wmdock_create_tile_dummy(); diff --git a/panel-plugin/rcfile.c b/panel-plugin/rcfile.c index 0a24da2..034908c 100644 --- a/panel-plugin/rcfile.c +++ b/panel-plugin/rcfile.c @@ -64,7 +64,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) if(!rc) return; - rcCmds = xfce_rc_read_list_entry(rc, RCKEY_CMDLIST, ";"); + rcCmds = xfce_rc_read_list_entry(rc, RCKEY_CMDLIST, RC_LIST_DELIMITER); wmdock->propDispTile = xfce_rc_read_bool_entry (rc, RCKEY_DISPTILE, TRUE); wmdock->propDispPropButton = xfce_rc_read_bool_entry (rc, RCKEY_DISPPROPBTN, FALSE); wmdock->propDispAddOnlyWM = xfce_rc_read_bool_entry (rc, RCKEY_DISPADDONLYWM, TRUE); @@ -72,7 +72,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) wmdock->filterList = g_strdup(xfce_rc_read_entry (rc, RCKEY_DAFILTER, DOCKAPP_FILTER_PATTERN)); /* TODO: Set panel off to FALSE. */ rcPanelOff = wmdock->propPanelOff = xfce_rc_read_bool_entry (rc, RCKEY_PANELOFF, TRUE); - glueList = IS_PANELOFF(wmdock) ? xfce_rc_read_list_entry(rc, RCKEY_GLUELIST, ";") : NULL; + glueList = IS_PANELOFF(wmdock) ? xfce_rc_read_list_entry(rc, RCKEY_GLUELIST, RC_LIST_DELIMITER) : NULL; wmdock->anchorPos = xfce_rc_read_int_entry(rc, RCKEY_ANCHORPOS, -1); xfce_rc_close (rc); @@ -124,17 +124,18 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) if( IS_PANELOFF( wmdock ) && g_strv_length(rcCmds) == g_strv_length(glueList) ) { for (i = 0; glueList[i]; i++) { - if(!launched[i] || glueList[i][0] == '\0' || !(glueInfo = g_strsplit(glueList[i], ",", 0))) + if(!launched[i] || glueList[i][0] == '\0' || !(glueInfo = g_strsplit(glueList[i], RC_GLUE_DELIMITER, 0))) continue; + /* Cleanup the default anchors. */ + memset(launched[i]->glue, '\0', sizeof(DockappNode *) * GLUE_MAX); + for (j = 0; glueInfo[j]; j++) { n = g_ascii_strtoll(glueInfo[j], &glueName, 10); if(n > G_MAXINT || n < 0 || n > g_strv_length(rcCmds)-1 || glueName == glueInfo[j] || glueName[0] != ':') continue; if((gluePos = wmdock_get_glue_position(&glueName[1])) == -1) continue; - if(j == 0) /* Cleanup the default anchors. */ - memset(launched[i]->glue, 0, sizeof(DockappNode *) * GLUE_MAX); launched[i]->glue[gluePos] = launched[(gint) n]; debug("rcfile.c: Restored panel off position. (`%s', %s = %d)", launched[i]->cmd, &glueName[1], gluePos); @@ -152,7 +153,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) void wmdock_write_rc_file (XfcePanelPlugin *plugin) { - gchar *file = NULL, *p = NULL; + gchar *file = NULL, *str = NULL; XfceRc *rc; gchar **cmdList = NULL; gchar **glueList = NULL; @@ -185,22 +186,22 @@ void wmdock_write_rc_file (XfcePanelPlugin *plugin) if(dapp->glue[gluePos] && (n = g_list_index(wmdock->dapps, (gconstpointer) dapp->glue[gluePos])) != -1) { /* ChildIndex1(n):position,ChildIndex2:postion,... */ if(strnlen((const char *) buf, sizeof(buf)-1) > 0) - p = g_strdup_printf(",%d:%s", n, wmdock_get_glue_name(gluePos)); + str = g_strdup_printf("%s%d:%s", RC_GLUE_DELIMITER, n, wmdock_get_glue_name(gluePos)); else - p = g_strdup_printf("%d:%s", n, wmdock_get_glue_name(gluePos)); - g_strlcat(buf, p, sizeof(buf)); - g_free(p); + str = g_strdup_printf("%d:%s", n, wmdock_get_glue_name(gluePos)); + g_strlcat(buf, str, sizeof(buf)); + g_free(str); } } glueList[i] = g_strdup(buf); } } - xfce_rc_write_list_entry(rc, RCKEY_CMDLIST, cmdList, ";"); + xfce_rc_write_list_entry(rc, RCKEY_CMDLIST, cmdList, RC_LIST_DELIMITER); g_strfreev(cmdList); if( IS_PANELOFF(wmdock) ) { - xfce_rc_write_list_entry(rc, RCKEY_GLUELIST, glueList, ";"); + xfce_rc_write_list_entry(rc, RCKEY_GLUELIST, glueList, RC_LIST_DELIMITER); g_strfreev(glueList); } diff --git a/panel-plugin/rcfile.h b/panel-plugin/rcfile.h index 7556487..8ad48c6 100644 --- a/panel-plugin/rcfile.h +++ b/panel-plugin/rcfile.h @@ -33,6 +33,9 @@ #define RCKEY_ANCHORPOS (const gchar *) "anchorpos" #define RCKEY_GLUELIST (const gchar *) "glues" +#define RC_LIST_DELIMITER (const gchar *) ";" +#define RC_GLUE_DELIMITER (const gchar *) "," + /* Prototypes */ void wmdock_read_rc_file (XfcePanelPlugin *); void wmdock_write_rc_file (XfcePanelPlugin *); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits