[Xfce4-commits] <xfce4-wmdock-plugin:0.6.x> Some changes on dockapp background drawing.

Andre Ellguth noreply at xfce.org
Thu Sep 26 22:00:01 CEST 2013


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

commit 42838e22732a9bfa8097079df3e78e65bf4495ae
Author: Andre Ellguth <andre at 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();


More information about the Xfce4-commits mailing list