[Xfce4-commits] <xfce4-wmdock-plugin:0.6.x> Write the dockapp postions in panel off mode to rc file.

Andre Ellguth noreply at xfce.org
Sun Oct 6 17:48:01 CEST 2013


Updating branch refs/heads/0.6.x
         to db7f29c982e45760ae35feb31ac2993f5c7524a4 (commit)
       from f6da1dc354d06d901c97b82f56a27e3171c5fc18 (commit)

commit db7f29c982e45760ae35feb31ac2993f5c7524a4
Author: Andre Ellguth <andre at ellguth.com>
Date:   Sun Oct 6 17:45:40 2013 +0200

    Write the dockapp postions in panel off mode to rc file.

 panel-plugin/dockapp.c |   55 +++++++++++++++++++++++++++++++++-
 panel-plugin/dockapp.h |    2 ++
 panel-plugin/misc.c    |    1 +
 panel-plugin/rcfile.c  |   77 +++++++++++++++++++++++++++++++-----------------
 panel-plugin/rcfile.h  |   10 +++++++
 5 files changed, 117 insertions(+), 28 deletions(-)

diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index 61a8872..d96260e 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -117,17 +117,21 @@ static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos
 	prim = (dapp == wmdock_get_primary_anchor_dockapp()) ? TRUE : FALSE;
 
 	switch(wmdock->anchorPos) {
-	/* Remove not possible snap positions for the first dockapp. */
+	/* Remove not possible snap positions for the dragging dockapp. */
 	case ANCHOR_TR:
+		possible^= (GLUE_T | GLUE_L);
 		possible^= prim == TRUE ? (GLUE_T | GLUE_L | GLUE_R) : 0;
 		break;
 	case ANCHOR_BR:
+		possible^= (GLUE_B | GLUE_R);
 		possible^= prim == TRUE ? (GLUE_B | GLUE_L | GLUE_R): 0;
 		break;
 	case ANCHOR_TL:
+		possible^= (GLUE_T | GLUE_R);
 		possible^= prim == TRUE ? (GLUE_T | GLUE_L | GLUE_R) : 0;
 		break;
 	case ANCHOR_BL:
+		possible^= (GLUE_B | GLUE_L);
 		possible^= prim == TRUE ? (GLUE_B | GLUE_L | GLUE_R) : 0;
 		break;
 	}
@@ -244,6 +248,55 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 }
 
 
+/* Return the translation from glue int postion to glue name.
+ *
+ * @param gluePos Position to be translated.
+ * @return String representation of the postion.
+ */
+const gchar *get_glue_name(const gint glusPos)
+{
+	static gchar ret[10];
+
+	switch(glusPos) {
+	case GLUE_B:
+		g_strlcpy(ret, "GLUE_B", sizeof(ret));
+		break;
+	case GLUE_L:
+		g_strlcpy(ret, "GLUE_L", sizeof(ret));
+		break;
+	case GLUE_R:
+		g_strlcpy(ret, "GLUE_R", sizeof(ret));
+		break;
+	case GLUE_T:
+		g_strlcpy(ret, "GLUE_T", sizeof(ret));
+		break;
+	default:
+		return NULL;
+	}
+
+	return (ret);
+}
+
+/* Return the translation from the glue name to the postion.
+ *
+ * @param name The name to be translated to a number.
+ * @return The position as integer. On error -1 is returned.
+ */
+gint get_glue_position(gchar const *name)
+{
+	if(!g_ascii_strcasecmp(name, "GLUE_B"))
+		return GLUE_B;
+	else if(!g_ascii_strcasecmp(name, "GLUE_L"))
+		return GLUE_L;
+	else if(!g_ascii_strcasecmp(name, "GLUE_R"))
+		return GLUE_R;
+	else if(!g_ascii_strcasecmp(name, "GLUE_T"))
+		return GLUE_T;
+
+	return -1;
+}
+
+
 /**
  * Determine the main anchor DockApp.
  *
diff --git a/panel-plugin/dockapp.h b/panel-plugin/dockapp.h
index 5ed850e..06fd2c1 100644
--- a/panel-plugin/dockapp.h
+++ b/panel-plugin/dockapp.h
@@ -75,5 +75,7 @@ void wmdock_remove_anchor_dockapp(DockappNode *, DockappNode *);
 void wmdock_order_dockapps(DockappNode *);
 GtkWidget *wmdock_create_tile_dummy();
 gint wmdock_get_default_gluepos();
+gint get_glue_position(gchar const *);
+const gchar *get_glue_name(const gint);
 
 #endif /* __DOCKAPP_H__ */
diff --git a/panel-plugin/misc.c b/panel-plugin/misc.c
index 3dd6a9e..8cea694 100644
--- a/panel-plugin/misc.c
+++ b/panel-plugin/misc.c
@@ -188,6 +188,7 @@ GdkScreen *get_current_gdkscreen()
 	return gdk_window_get_screen(gtk_widget_get_toplevel(GTK_WIDGET(wmdock->plugin))->window);
 }
 
+
 /**
  * Returns the default anchor postion for the XFCE panel.
  *
diff --git a/panel-plugin/rcfile.c b/panel-plugin/rcfile.c
index 71008fe..e567ce3 100644
--- a/panel-plugin/rcfile.c
+++ b/panel-plugin/rcfile.c
@@ -40,6 +40,7 @@
 #include "wmdock.h"
 #include "debug.h"
 #include "dockapp.h"
+#include "misc.h"
 #include "props.h"
 
 
@@ -58,16 +59,16 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin)
 
 	if(!rc) return;
 
-	rcCmds                     = xfce_rc_read_list_entry(rc, "cmds", ";");
-	rcCmdcnt                   = xfce_rc_read_int_entry(rc, "cmdcnt", 0);
-	wmdock->propDispTile       = xfce_rc_read_bool_entry (rc, "disptile", TRUE);
-	wmdock->propDispPropButton = xfce_rc_read_bool_entry (rc, "disppropbtn", FALSE);
-	wmdock->propDispAddOnlyWM  = xfce_rc_read_bool_entry (rc, "dispaddonlywm", TRUE);
+	rcCmds                     = xfce_rc_read_list_entry(rc, RCKEY_CMDLIST, ";");
+	rcCmdcnt                   = xfce_rc_read_int_entry(rc, RCKEY_CMDCNT, 0);
+	wmdock->propDispTile       = xfce_rc_read_bool_entry (rc, RCKEY_DISPTILE, TRUE);
+	wmdock->propDispPropButton = xfce_rc_read_bool_entry (rc, RCKEY_DISPPROPBTN, FALSE);
+	wmdock->propDispAddOnlyWM  = xfce_rc_read_bool_entry (rc, RCKEY_DISPADDONLYWM, TRUE);
 	if(wmdock->filterList) g_free(wmdock->filterList);
-	wmdock->filterList         = g_strdup(xfce_rc_read_entry (rc, "dafilter", DOCKAPP_FILTER_PATTERN));
+	wmdock->filterList         = g_strdup(xfce_rc_read_entry (rc, RCKEY_DAFILTER, DOCKAPP_FILTER_PATTERN));
 	/* TODO: Set panel off to FALSE. */
-	rcPanelOff = wmdock->propPanelOff = xfce_rc_read_bool_entry (rc, "paneloff", TRUE);
-	wmdock->anchorPos          = xfce_rc_read_int_entry(rc, "anchorpos", -1);
+	rcPanelOff = wmdock->propPanelOff = xfce_rc_read_bool_entry (rc, RCKEY_PANELOFF, TRUE);
+	wmdock->anchorPos          = xfce_rc_read_int_entry(rc, RCKEY_ANCHORPOS, -1);
 
 	if(G_LIKELY(rcCmds != NULL)) {
 		/* Wait 5 seconds as workaround for double XMap problems. */
@@ -111,7 +112,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin)
 				}
 			}
 		}
-	}
+	} /* rcCmds != NULL */
 
 	xfce_rc_close (rc);
 }
@@ -119,12 +120,14 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin)
 
 void wmdock_write_rc_file (XfcePanelPlugin *plugin)
 {
-	gchar       *file;
+	gchar       *file = NULL, *p = NULL;
 	XfceRc      *rc;
-	gchar       **cmds = NULL;
+	gchar       **cmdList = NULL;
+	gchar       **glueList = NULL;
+	gchar       buf[BUF_MAX];
 	GList       *dapps;
 	DockappNode *dapp = NULL;
-	gint        i = 0;
+	gint        i = 0, gluePos = 0, j = 0;
 
 	if (!(file = xfce_panel_plugin_save_location (plugin, TRUE))) return;
 
@@ -134,27 +137,47 @@ void wmdock_write_rc_file (XfcePanelPlugin *plugin)
 	if (!rc) return;
 
 	if(g_list_length (wmdock->dapps) > 0) {
-		cmds = g_malloc0(sizeof (gchar *) * (g_list_length (wmdock->dapps) + 1));
+		cmdList = g_malloc0(sizeof (gchar *) * (g_list_length (wmdock->dapps) + 1));
+		if ( IS_PANELOFF(wmdock) )
+			glueList = g_malloc0(sizeof (gchar *) * (g_list_length (wmdock->dapps) + 1));
 
-		dapps = g_list_first(wmdock->dapps);
-		while(dapps) {
+		for(dapps = g_list_first(wmdock->dapps) ; dapps; dapps = g_list_next(dapps)) {
 			dapp = DOCKAPP(dapps->data);
-			if(dapp && dapp->cmd)
-				cmds[i++] = g_strdup(dapp->cmd);
-			dapps = g_list_next(dapps);
+			if((i = g_list_index(wmdock->dapps, (gconstpointer) dapp)) == -1)
+				continue;
+			cmdList[i] = dapp->cmd ? g_strdup(dapp->cmd) : NULL;
+			if( IS_PANELOFF(wmdock) ) {
+				buf[0] = '\0';
+				for(gluePos = 0; gluePos < GLUE_MAX; gluePos++) {
+					if(dapp->glue[gluePos] && (j = g_list_index(wmdock->dapps, (gconstpointer) dapp->glue[gluePos])) != -1) {
+						/* ChildIndex1(j):position,ChildIndex2:postion,... */
+						if(strlen((const char *) buf) > 0)
+							p = g_strdup_printf(",%d:%s", j, get_glue_name(gluePos));
+						else
+							p = g_strdup_printf("%d:%s", j, get_glue_name(gluePos));
+						g_strlcat(buf, p, sizeof(buf));
+						g_free(p);
+					}
+				}
+				glueList[i] = g_strdup(buf);
+			}
 		}
 
-		xfce_rc_write_list_entry(rc, "cmds", cmds, ";");
+		xfce_rc_write_list_entry(rc, RCKEY_CMDLIST, cmdList, ";");
+		g_strfreev(cmdList);
 
-		g_strfreev(cmds);
+		if( IS_PANELOFF(wmdock) ) {
+			xfce_rc_write_list_entry(rc, RCKEY_GLUELIST, glueList, ";");
+			g_strfreev(glueList);
+		}
 
-		xfce_rc_write_int_entry (rc, "cmdcnt", g_list_length (wmdock->dapps));
-		xfce_rc_write_bool_entry (rc, "disptile", wmdock->propDispTile);
-		xfce_rc_write_bool_entry (rc, "disppropbtn", wmdock->propDispPropButton);
-		xfce_rc_write_bool_entry (rc, "dispaddonlywm", wmdock->propDispAddOnlyWM);
-		xfce_rc_write_bool_entry (rc, "paneloff", rcPanelOff);
-		xfce_rc_write_entry(rc, "dafilter", wmdock->filterList);
-		xfce_rc_write_int_entry (rc, "anchorpos", wmdock->anchorPos);
+		xfce_rc_write_int_entry (rc, RCKEY_CMDCNT, g_list_length (wmdock->dapps));
+		xfce_rc_write_bool_entry (rc, RCKEY_DISPTILE, wmdock->propDispTile);
+		xfce_rc_write_bool_entry (rc, RCKEY_DISPPROPBTN, wmdock->propDispPropButton);
+		xfce_rc_write_bool_entry (rc, RCKEY_DISPADDONLYWM, wmdock->propDispAddOnlyWM);
+		xfce_rc_write_bool_entry (rc, RCKEY_PANELOFF, rcPanelOff);
+		xfce_rc_write_entry(rc, RCKEY_DAFILTER, wmdock->filterList);
+		xfce_rc_write_int_entry (rc, RCKEY_ANCHORPOS, wmdock->anchorPos);
 	}
 
 	xfce_rc_close(rc);
diff --git a/panel-plugin/rcfile.h b/panel-plugin/rcfile.h
index 6d4339f..7556487 100644
--- a/panel-plugin/rcfile.h
+++ b/panel-plugin/rcfile.h
@@ -23,6 +23,16 @@
 #ifndef __RCFILE_H__
 #define __RCFILE_H__
 
+#define RCKEY_CMDLIST       (const gchar *) "cmds"
+#define RCKEY_CMDCNT        (const gchar *) "cmdcnt"
+#define RCKEY_DISPTILE      (const gchar *) "disptile"
+#define RCKEY_DISPPROPBTN   (const gchar *) "disppropbtn"
+#define RCKEY_DISPADDONLYWM (const gchar *) "dispaddonlywm"
+#define RCKEY_PANELOFF      (const gchar *) "paneloff"
+#define RCKEY_DAFILTER      (const gchar *) "dafilter"
+#define RCKEY_ANCHORPOS     (const gchar *) "anchorpos"
+#define RCKEY_GLUELIST      (const gchar *) "glues"
+
 /* Prototypes */
 void wmdock_read_rc_file (XfcePanelPlugin *);
 void wmdock_write_rc_file (XfcePanelPlugin *);


More information about the Xfce4-commits mailing list