[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