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