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

Reply via email to