Updating branch refs/heads/0.6.x to 42838e22732a9bfa8097079df3e78e65bf4495ae (commit) from a5a23d4397b58043b04917f9139adbf66735f624 (commit)
commit 42838e22732a9bfa8097079df3e78e65bf4495ae Author: Andre Ellguth <an...@ellguth.com> Date: Thu Sep 26 21:57:54 2013 +0200 Some changes on dockapp background drawing. panel-plugin/catchwindow.c | 23 +++++---- panel-plugin/dockapp.c | 114 +++++++++++++++++++++++++++++++------------- panel-plugin/dockapp.h | 25 ++++++---- 3 files changed, 109 insertions(+), 53 deletions(-) diff --git a/panel-plugin/catchwindow.c b/panel-plugin/catchwindow.c index e12ef92..2a2252e 100644 --- a/panel-plugin/catchwindow.c +++ b/panel-plugin/catchwindow.c @@ -140,9 +140,7 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) return; } debug("catchwindow.c: found cmd %s for window %s", cmd, wnck_window_get_name(w)); - - if(rcCmds && (dapp = wmdock_find_startup_dockapp(cmd))) - rcDapp = TRUE; + rcDapp = rcCmds && (dapp = wmdock_find_startup_dockapp(cmd)) ? TRUE : FALSE; if(rcDapp == FALSE) { debug("catchwindow.c: Create a new dapp window %s", wnck_window_get_name(w)); @@ -152,15 +150,13 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) } if(h->initial_state == WithdrawnState && h->icon_window) { - XUnmapWindow(GDK_DISPLAY_XDISPLAY(get_current_gdkdisplay()), - wnck_window_get_xid(w)); + XUnmapWindow(GDK_DISPLAY_XDISPLAY(get_current_gdkdisplay()), wnck_window_get_xid(w)); dapp->i =h->icon_window; } else { dapp->i = wnck_window_get_xid(w); } - if(!XGetWindowAttributes(GDK_DISPLAY_XDISPLAY(get_current_gdkdisplay()), - dapp->i, &attr)) { + if(!XGetWindowAttributes(GDK_DISPLAY_XDISPLAY(get_current_gdkdisplay()), dapp->i, &attr)) { wi = DEFAULT_DOCKAPP_WIDTH; he = DEFAULT_DOCKAPP_HEIGHT; } else { @@ -191,6 +187,8 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) dapp->name = g_strdup(wnck_window_get_name(w)); dapp->cmd = cmd; + dapp->width = wi; + dapp->height = he; if(wmdockIcon && !IS_PANELOFF(wmdock)) { gtk_widget_destroy(wmdockIcon); @@ -214,6 +212,9 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) wmdock_set_autoposition_dockapp(dapp, g_list_last(wmdock->dapps) ? g_list_last(wmdock->dapps)->data : NULL); } + } else { + /* Change the postion of the DockApp with the newly determined width and height. of the window */ + wmdock_set_socket_postion(dapp, (DEFAULT_DOCKAPP_WIDTH - wi) / 2, (DEFAULT_DOCKAPP_HEIGHT - he) / 2); } gtk_socket_add_id(dapp->s, dapp->i); @@ -234,15 +235,17 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) if( IS_PANELOFF(wmdock) ) { if(rcDapp == TRUE) { _dapps = g_list_find(wmdock->dapps, (gconstpointer) dapp); - wmdock_set_autoposition_dockapp( dapp, - (DOCKAPP(g_list_first(wmdock->dapps)->data) != dapp && _dapps) ? + wmdock_set_autoposition_dockapp( dapp, (DOCKAPP(g_list_first(wmdock->dapps)->data) != dapp && _dapps) ? DOCKAPP(((GList *) g_list_previous(_dapps))->data) : NULL); wmdock_order_dockapps(DOCKAPP(g_list_first(wmdock->dapps)->data)); } /* Setup the event handler for the window. */ - g_signal_connect(dapp->tile, "event-after", G_CALLBACK(wmdock_dockapp_paneloff_handler), dapp); + 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 06eac91..812852f 100644 --- a/panel-plugin/dockapp.c +++ b/panel-plugin/dockapp.c @@ -287,13 +287,53 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp) /** - * Event handler for the tile in panel off mode. + * 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); +} + + +/** + * 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); +} + + +/** + * 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) +{ + debug("dockapp.c: Window motion notify event (dapp: `%s')", dapp->name); +} + + + +/** + * 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_paneloff_handler(GtkWidget *tile, GdkEvent *ev, DockappNode *dapp) +void wmdock_dockapp_event_after_handler(GtkWidget *tile, GdkEvent *ev, DockappNode *dapp) { static DockappNode *dappOnMove = NULL, *dappDummy = NULL; DockappNode *dappSnap = NULL; @@ -591,17 +631,16 @@ void wmdock_redraw_dockapp(DockappNode *dapp) */ void wmdock_update_tile_background(DockappNode *dapp) { - gtk_widget_realize(GTK_WIDGET(dapp->s)); + gtk_widget_realize(GTK_WIDGET(dapp->bg)); if (!dapp->bgimg) return; - gtk_widget_set_app_paintable(GTK_WIDGET(dapp->s), TRUE); - gdk_window_set_back_pixmap(GTK_WIDGET(dapp->s)->window, dapp->bgimg, FALSE); - - if (GTK_WIDGET_FLAGS(GTK_WIDGET(dapp->s)) & GTK_MAPPED) - gtk_widget_queue_draw(GTK_WIDGET(dapp->s)); + gtk_widget_set_app_paintable(GTK_WIDGET(dapp->bg), TRUE); + gdk_window_set_back_pixmap(GTK_WIDGET(dapp->bg)->window, dapp->bgimg, FALSE); + if (GTK_WIDGET_FLAGS(GTK_WIDGET(dapp->bg)) & GTK_MAPPED) + gtk_widget_queue_draw(GTK_WIDGET(dapp->bg)); } @@ -659,12 +698,8 @@ DockappNode *wmdock_get_parent_dockapp(DockappNode *dapp) { */ void wmdock_set_tile_background(DockappNode *dapp, GdkPixbuf *pb) { - GtkFixed *fixed = NULL; GdkGC * gc = NULL; - if(!(fixed = (GtkFixed *) gtk_widget_get_ancestor(GTK_WIDGET(dapp->s), GTK_TYPE_FIXED))) - return; - if(wmdock->propDispTile == FALSE) { if(!dapp->bg) return; @@ -679,23 +714,33 @@ void wmdock_set_tile_background(DockappNode *dapp, GdkPixbuf *pb) return; } - debug("dockapp.c: Setup background image (wmdock_set_tile_background)."); - gtk_widget_realize(GTK_WIDGET(dapp->tile)); + 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); - gc = gdk_gc_new(GTK_WIDGET(dapp->tile)->window); + gdk_window_clear(GTK_WIDGET(dapp->bg)->window); + gc = gdk_gc_new(GTK_WIDGET(dapp->bg)->window); gdk_draw_pixbuf(dapp->bgimg, gc, pb, 0, 0, 0, 0, DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT, GDK_RGB_DITHER_NONE, 0, 0); gdk_gc_unref(gc); - gtk_image_clear(GTK_IMAGE(dapp->bg)); - gtk_image_set_from_pixmap(GTK_IMAGE(dapp->bg),dapp->bgimg,NULL); - - if(dapp->s) + if(dapp->bg) wmdock_update_tile_background(dapp); + +} + + +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))) + return; + + gtk_fixed_move(fixed, GTK_WIDGET(dapp->s), x, y); } @@ -733,8 +778,7 @@ GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp) tile = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(tile), dapp->name); - gtk_window_set_default_size(GTK_WINDOW(tile), DEFAULT_DOCKAPP_WIDTH, - DEFAULT_DOCKAPP_HEIGHT); + gtk_window_set_default_size(GTK_WINDOW(tile), DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); gtk_container_set_border_width(GTK_CONTAINER(tile), 0); /* Disable window shrinking resizing and growing. */ @@ -748,28 +792,30 @@ 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(); - gtk_fixed_put(GTK_FIXED(fixed), dapp->bg, 0, 0); + 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); - /* Center Dockapp in the window. */ - 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_window_set_default_size(GTK_WINDOW(tile), DEFAULT_DOCKAPP_WIDTH, - DEFAULT_DOCKAPP_HEIGHT); - gtk_container_add(GTK_CONTAINER(align), GTK_WIDGET(dapp->s)); - /* Add the alignment container to the window. */ - gtk_fixed_put(GTK_FIXED(fixed), align, 0, 0); + /* 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(align); + gtk_widget_show(fixed); } return (tile); } - /** * Calculate the position of the DockApp if the PanelOff mode is active. * diff --git a/panel-plugin/dockapp.h b/panel-plugin/dockapp.h index 21cb884..2687107 100644 --- a/panel-plugin/dockapp.h +++ b/panel-plugin/dockapp.h @@ -35,14 +35,17 @@ enum GluePosition { typedef struct _dockapp DockappNode; struct _dockapp { - GtkSocket *s; - GdkNativeWindow i; - GtkWidget *bg; - GdkPixmap *bgimg; - GtkWidget *tile; - gchar *name; - gchar *cmd; - DockappNode *glue[GLUE_MAX]; + GtkSocket *s; + GdkNativeWindow i; + int width; + int height; + GtkWidget *bg; + GdkPixmap *bgimg; + GtkWidget *evbox; + GtkWidget *tile; + gchar *name; + gchar *cmd; + DockappNode *glue[GLUE_MAX]; }; #define DOCKAPP_DUMMY_TITLE "__WMDOCK_dummy__" @@ -56,6 +59,7 @@ void wmdock_free_dockapp(DockappNode *); void wmdock_dapp_closed(GtkSocket *, DockappNode *); DockappNode *wmdock_find_startup_dockapp(const gchar *); GtkWidget *wmdock_create_tile_from_socket(DockappNode *); +void wmdock_set_socket_postion(DockappNode *, int, int); void wmdock_set_autoposition_dockapp(DockappNode *, DockappNode *); void wmdock_refresh_bg(GtkWidget *widget); void wmdock_set_tile_background(DockappNode *, GdkPixbuf *); @@ -63,7 +67,10 @@ void wmdock_update_tile_background(DockappNode *); gboolean wmdock_is_first_dockapp(DockappNode *); DockappNode *wmdock_get_parent_dockapp(DockappNode *); void wmdock_dockapp_tofront(DockappNode *dapp); -void wmdock_dockapp_paneloff_handler(GtkWidget *, GdkEvent *, DockappNode *); +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(); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits