[Xfce4-commits] <xfce4-wmdock-plugin:master> Write the dockapp postions in panel off mode to rc file.
Andre Ellguth
noreply at xfce.org
Mon Nov 4 13:36:26 CET 2013
Updating branch refs/heads/master
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