Updating branch refs/heads/0.6.x
         to d3e1aec12fe7f64c24a0c86ec352c04fc2d988c8 (commit)
       from 42838e22732a9bfa8097079df3e78e65bf4495ae (commit)

commit d3e1aec12fe7f64c24a0c86ec352c04fc2d988c8
Author: Andre Ellguth <an...@ellguth.com>
Date:   Fri Sep 27 18:04:18 2013 +0200

    Fixed background tile glitch.
    Some improvments for the dockapp movement.

 panel-plugin/dockapp.c |  198 +++++++++++++++++++++++-------------------------
 1 file changed, 93 insertions(+), 105 deletions(-)

diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index 812852f..da09029 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -49,6 +49,7 @@ static GtkTargetEntry targetList[] = {
                { "INTEGER", 0, 0 }
 };
 static guint nTargets = G_N_ELEMENTS (targetList);
+static DockappNode *dappOnMotion = NULL, *dappDummy = NULL;;
 
 /**
  * Get the x coordinate child dockapp.
@@ -296,6 +297,8 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 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;
+       gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), TRUE);
 }
 
 
@@ -309,6 +312,19 @@ void wmdock_dockapp_button_press_handler(GtkWidget *tile, 
GdkEventButton *ev, Do
 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);
 }
 
 
@@ -321,7 +337,35 @@ void wmdock_dockapp_button_release_handler(GtkWidget 
*tile, GdkEventButton *ev,
  */
 void wmdock_dockapp_motion_notify_handler(GtkWidget *tile, GdkEventMotion *ev, 
DockappNode *dapp)
 {
+       gint gluepos;
+       DockappNode *dappSnap = NULL;
+       GdkModifierType m;
+
        debug("dockapp.c: Window motion notify event (dapp: `%s')", dapp->name);
+
+       gdk_window_get_pointer(tile->window, NULL, NULL, &m);
+       if(tile && (m & GDK_BUTTON1_MASK)) {
+
+       }
+
+       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);
+               }
+       }
 }
 
 
@@ -335,63 +379,25 @@ void wmdock_dockapp_motion_notify_handler(GtkWidget 
*tile, GdkEventMotion *ev, D
  */
 void wmdock_dockapp_event_after_handler(GtkWidget *tile, GdkEvent *ev, 
DockappNode *dapp)
 {
-       static DockappNode *dappOnMove = NULL, *dappDummy = NULL;
-       DockappNode *dappSnap = NULL;
-       gint gluepos;
-       GdkModifierType gdkmodtype;
+       GdkModifierType m;
 
        debug("dockapp.c: Window event after: %d. (dapp: `%s'), dappOnMove: 
%s", ev->type, dapp->name,
-                       dappOnMove ? "Yes": "No");
-
+                       dappOnMotion ? "Yes": "No");
        switch(ev->type) {
        case GDK_CONFIGURE:
-               gdk_window_get_pointer(tile->window, NULL, NULL, &gdkmodtype);
-               if(!dappOnMove && (gdkmodtype & GDK_BUTTON1_MASK)) {
-                       /* Movement. */
-                       debug("dockapp.c: Start dockapp movement (dapp: `%s')", 
dapp->name);
-                       dappOnMove = dapp;
+               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(dappOnMove) {
-                       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);
-                       }
-               }
-
-               gdk_window_get_pointer(tile->window, NULL, NULL, &gdkmodtype);
-               if(!(dappOnMove && !(gdkmodtype & GDK_BUTTON1_MASK)))
+               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:
-               debug("dockapp.c: Window event button release on `%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);
-               }
-               gtk_window_set_keep_above(GTK_WINDOW(dapp->tile), FALSE);
-               dappOnMove = NULL;
-
+               wmdock_dockapp_button_release_handler(NULL, &ev->button, dapp);
                break;
        case GDK_FOCUS_CHANGE:
                if(ev->focus_change.in == TRUE) {
@@ -631,16 +637,16 @@ void wmdock_redraw_dockapp(DockappNode *dapp)
  */
 void wmdock_update_tile_background(DockappNode *dapp)
 {
-       gtk_widget_realize(GTK_WIDGET(dapp->bg));
+       gtk_widget_realize(GTK_WIDGET(dapp->evbox));
 
        if (!dapp->bgimg)
                return;
 
-       gtk_widget_set_app_paintable(GTK_WIDGET(dapp->bg), TRUE);
-       gdk_window_set_back_pixmap(GTK_WIDGET(dapp->bg)->window, dapp->bgimg, 
FALSE);
+       gtk_widget_set_app_paintable(GTK_WIDGET(dapp->evbox), TRUE);
+       gdk_window_set_back_pixmap(GTK_WIDGET(dapp->evbox)->window, 
dapp->bgimg, FALSE);
 
-       if (GTK_WIDGET_FLAGS(GTK_WIDGET(dapp->bg)) & GTK_MAPPED)
-               gtk_widget_queue_draw(GTK_WIDGET(dapp->bg));
+       if (GTK_WIDGET_FLAGS(GTK_WIDGET(dapp->evbox)) & GTK_MAPPED)
+               gtk_widget_queue_draw(GTK_WIDGET(dapp->evbox));
 }
 
 
@@ -717,8 +723,8 @@ void wmdock_set_tile_background(DockappNode *dapp, 
GdkPixbuf *pb)
        debug("dockapp.c: Setup background image for dapp `%s' 
(wmdock_set_tile_background).", dapp->name);
        gtk_widget_realize(GTK_WIDGET(dapp->bg));
 
-       dapp->bgimg = gdk_pixmap_new(GTK_WIDGET(dapp->tile)->window,
-                       DEFAULT_DOCKAPP_WIDTH,DEFAULT_DOCKAPP_HEIGHT, -1);
+       if(!dapp->bgimg)
+               dapp->bgimg = gdk_pixmap_new(GTK_WIDGET(dapp->tile)->window, 
DEFAULT_DOCKAPP_WIDTH,DEFAULT_DOCKAPP_HEIGHT, -1);
 
        gdk_window_clear(GTK_WIDGET(dapp->bg)->window);
        gc = gdk_gc_new(GTK_WIDGET(dapp->bg)->window);
@@ -737,45 +743,43 @@ void wmdock_set_socket_postion(DockappNode *dapp, int x, 
int y)
 {
        GtkFixed *fixed = NULL;
 
-       if(!(fixed = (GtkFixed *) gtk_widget_get_ancestor(GTK_WIDGET(dapp->s), 
GTK_TYPE_FIXED)))
+       if(!(fixed = (GtkFixed *) 
gtk_widget_get_ancestor(GTK_WIDGET(dapp->evbox), GTK_TYPE_FIXED)))
                return;
 
-       gtk_fixed_move(fixed, GTK_WIDGET(dapp->s), x, y);
+       gtk_widget_set_size_request(GTK_WIDGET(dapp->evbox), dapp->width, 
dapp->height);
+       gtk_fixed_move(fixed, GTK_WIDGET(dapp->evbox), x, y);
 }
 
 
 GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp)
 {
-       GtkWidget *align = NULL;
        GtkWidget *tile = NULL;
        GtkWidget *fixed = NULL;
 
-       if( ! IS_PANELOFF(wmdock)) {
-               /* Default: Put the Dockapp in the XFCE panel. */
-               debug("dockapp.c: DockApp pushed in the XFCE panel.");
-               tile = fixed = gtk_fixed_new();
-               gtk_container_set_border_width(GTK_CONTAINER(fixed),0);
-
-               /* Add the background tile. */
-               dapp->bg = gtk_image_new();
-               gtk_fixed_put(GTK_FIXED(fixed), dapp->bg, 0, 0);
-
-               align = gtk_alignment_new(0.5, 0.5, 0, 0);
-               gtk_widget_set_size_request(GTK_WIDGET(align), 
DEFAULT_DOCKAPP_WIDTH,
-                               DEFAULT_DOCKAPP_HEIGHT);
-               gtk_container_add(GTK_CONTAINER(align), GTK_WIDGET(dapp->s));
-               gtk_fixed_put(GTK_FIXED(fixed), align, 0, 0);
-
-               gtk_widget_show(align);
-       } else {
+       tile = fixed = gtk_fixed_new();
+       gtk_container_set_border_width(GTK_CONTAINER(fixed), 0);
+
+       /* Create an eventbox to catch all click and motion events. */
+       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),
+                       (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);
+
+
+       if( IS_PANELOFF(wmdock) ) {
                /* If propDispPanelOff is true create a separate window with the
                 * Dockapp in it. It's emulates WindowMaker much more.
                 */
-               debug("dockapp.c: Setup a separate window for the DockApp.");
-               fixed = gtk_fixed_new();
-               gtk_container_set_border_width(GTK_CONTAINER(fixed),0);
-
                tile = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+               debug("dockapp.c: Setup a separate window for the DockApp.");
 
                gtk_window_set_title(GTK_WINDOW(tile), dapp->name);
                gtk_window_set_default_size(GTK_WINDOW(tile), 
DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT);
@@ -792,27 +796,11 @@ 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);
 
-               /* Create an eventbox to catch all click and motion events. */
-               dapp->evbox = gtk_event_box_new();
-               gtk_event_box_set_above_child(GTK_EVENT_BOX(dapp->evbox), TRUE);
-               gtk_widget_set_size_request(GTK_WIDGET(dapp->evbox), 
DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT);
-
-               /* Add the background tile. */
-               dapp->bg = gtk_image_new_from_pixbuf(gdkPbTileDefault);
-               gtk_widget_set_size_request(GTK_WIDGET(dapp->bg), 
DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT);
-               gtk_container_add(GTK_CONTAINER(dapp->evbox), dapp->bg);
-
-               /* Add the eventbox to the window. */
-               gtk_fixed_put(GTK_FIXED(fixed), dapp->evbox, 0, 0);
-
-               /* Add the GtkSocket with the dockapp fixed and centered. */
-               gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(dapp->s),
-                               (DEFAULT_DOCKAPP_WIDTH - dapp->width) / 2, 
(DEFAULT_DOCKAPP_HEIGHT - dapp->height) / 2);
-
                gtk_container_add(GTK_CONTAINER(tile), fixed);
-
-               gtk_widget_show(fixed);
        }
+
+       gtk_widget_show(fixed);
+
        return (tile);
 }
 
@@ -870,13 +858,13 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, 
DockappNode *prevDapp)
                                if(xfceScrPos == XFCE_SCREEN_POSITION_NW_V ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_W ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SW_V) {
-                                       offsetx = panelx == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) : 0;
+                                       offsetx = panelx == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) + 1 : 0;
                                        offsety = 0;
                                } else if (xfceScrPos == 
XFCE_SCREEN_POSITION_NW_H ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_N ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_NE_H) {
                                        offsetx = 0;
-                                       offsety = panely == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) : 0;
+                                       offsety = panely == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) + 1 : 0;
                                }
 
                                x = 0 + offsetx;
@@ -886,13 +874,13 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, 
DockappNode *prevDapp)
                                if(xfceScrPos == XFCE_SCREEN_POSITION_NE_V ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_E ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SE_V) {
-                                       offsetx = 
xfce_panel_plugin_get_size(wmdock->plugin);
+                                       offsetx = 
xfce_panel_plugin_get_size(wmdock->plugin) + 1;
                                        offsety = 0;
                                } else if (xfceScrPos == 
XFCE_SCREEN_POSITION_NW_H ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_N ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_NE_H) {
                                        offsetx = 0;
-                                       offsety = panely == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) : 0;
+                                       offsety = panely == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) + 1 : 0;
                                }
 
                                x = 
gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH - offsetx;
@@ -902,13 +890,13 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, 
DockappNode *prevDapp)
                                if(xfceScrPos == XFCE_SCREEN_POSITION_NW_V ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_W ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SW_V) {
-                                       offsetx = panelx == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) : 0;
+                                       offsetx = panelx == 0 ? 
xfce_panel_plugin_get_size(wmdock->plugin) + 1 : 0;
                                        offsety = 0;
                                } else if (xfceScrPos == 
XFCE_SCREEN_POSITION_SW_H ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_S ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SE_H) {
                                        offsetx = 0;
-                                       offsety = 
xfce_panel_plugin_get_size(wmdock->plugin);
+                                       offsety = 
xfce_panel_plugin_get_size(wmdock->plugin) + 1;
                                }
 
                                x = 0 + offsetx;
@@ -918,13 +906,13 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, 
DockappNode *prevDapp)
                                if(xfceScrPos == XFCE_SCREEN_POSITION_NE_V ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_E ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SE_V) {
-                                       offsetx = 
xfce_panel_plugin_get_size(wmdock->plugin);
+                                       offsetx = 
xfce_panel_plugin_get_size(wmdock->plugin) + 1;
                                        offsety = 0;
                                } else if (xfceScrPos == 
XFCE_SCREEN_POSITION_SW_H ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_S ||
                                                xfceScrPos == 
XFCE_SCREEN_POSITION_SE_H) {
                                        offsetx = 0;
-                                       offsety = 
xfce_panel_plugin_get_size(wmdock->plugin);
+                                       offsety = 
xfce_panel_plugin_get_size(wmdock->plugin) + 1;
                                }
 
                                x = 
gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH - offsetx;
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to