Updating branch refs/heads/0.6.x to 79f73db43ddd64ac4224286ef9abc53f526dd898 (commit) from db7f29c982e45760ae35feb31ac2993f5c7524a4 (commit)
commit 79f73db43ddd64ac4224286ef9abc53f526dd898 Author: Andre Ellguth <an...@ellguth.com> Date: Tue Oct 8 18:22:17 2013 +0200 Implemented restoring dockapp postion from rc file. panel-plugin/dockapp.c | 4 +-- panel-plugin/dockapp.h | 4 +-- panel-plugin/extern.h | 1 - panel-plugin/rcfile.c | 66 ++++++++++++++++++++++++++++++++++-------------- panel-plugin/wmdock.c | 1 - 5 files changed, 51 insertions(+), 25 deletions(-) diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c index d96260e..fc2535a 100644 --- a/panel-plugin/dockapp.c +++ b/panel-plugin/dockapp.c @@ -253,7 +253,7 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp) * @param gluePos Position to be translated. * @return String representation of the postion. */ -const gchar *get_glue_name(const gint glusPos) +const gchar *wmdock_get_glue_name(const gint glusPos) { static gchar ret[10]; @@ -282,7 +282,7 @@ const gchar *get_glue_name(const gint glusPos) * @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) +gint wmdock_get_glue_position(gchar const *name) { if(!g_ascii_strcasecmp(name, "GLUE_B")) return GLUE_B; diff --git a/panel-plugin/dockapp.h b/panel-plugin/dockapp.h index 06fd2c1..3873eec 100644 --- a/panel-plugin/dockapp.h +++ b/panel-plugin/dockapp.h @@ -75,7 +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); +gint wmdock_get_glue_position(gchar const *); +const gchar *wmdock_get_glue_name(const gint); #endif /* __DOCKAPP_H__ */ diff --git a/panel-plugin/extern.h b/panel-plugin/extern.h index cb83c13..bda4b0c 100644 --- a/panel-plugin/extern.h +++ b/panel-plugin/extern.h @@ -31,7 +31,6 @@ extern GdkPixbuf *gdkPbTileDefault; extern GtkWidget *wmdockIcon; extern Atom XfceDockAppAtom; extern gchar **rcCmds; -extern gint rcCmdcnt; extern gboolean rcPanelOff; #endif /* __EXTERN_H__ */ diff --git a/panel-plugin/rcfile.c b/panel-plugin/rcfile.c index e567ce3..771cb51 100644 --- a/panel-plugin/rcfile.c +++ b/panel-plugin/rcfile.c @@ -48,37 +48,45 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) { gchar *file = NULL; XfceRc *rc = NULL; - gint i; + gint i = 0, j = 0, gluePos = 0; + gint64 n = 0; + gchar *glueName = NULL; GtkWidget *gtkDlg; DockappNode *dapp = NULL; + DockappNode **launched = NULL; + gchar **glueList = NULL; + gchar **tokens = NULL; if (!(file = xfce_panel_plugin_lookup_rc_file (plugin))) return; rc = xfce_rc_simple_open (file, TRUE); g_free(file); - - if(!rc) return; + if(!rc) + return; 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, RCKEY_DAFILTER, DOCKAPP_FILTER_PATTERN)); /* TODO: Set panel off to FALSE. */ - rcPanelOff = wmdock->propPanelOff = xfce_rc_read_bool_entry (rc, RCKEY_PANELOFF, TRUE); + rcPanelOff = wmdock->propPanelOff = xfce_rc_read_bool_entry (rc, RCKEY_PANELOFF, TRUE); + glueList = IS_PANELOFF(wmdock) ? xfce_rc_read_list_entry(rc, RCKEY_GLUELIST, ";") : NULL; wmdock->anchorPos = xfce_rc_read_int_entry(rc, RCKEY_ANCHORPOS, -1); + xfce_rc_close (rc); if(G_LIKELY(rcCmds != NULL)) { - /* Wait 5 seconds as workaround for double XMap problems. */ - g_usleep(5 * G_USEC_PER_SEC); + if(!(launched = g_malloc0(sizeof (DockappNode *) * (g_strv_length(rcCmds))))) + return; - for (i = 0; i <= rcCmdcnt; i++) { - if(!rcCmds[i]) continue; + /* Wait 1 seconds as workaround for double XMap problems. */ + g_usleep(1 * G_USEC_PER_SEC); + for (i = 0; rcCmds[i]; i++) { debug("rcfile.c: Setup `%s'\n", rcCmds[i]); if(wmdock_startup_dockapp(rcCmds[i]) != TRUE) { + launched[i] = NULL; gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, @@ -99,6 +107,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) dapp->tile = wmdock_create_tile_from_socket(dapp); wmdock->dapps = g_list_append(wmdock->dapps, dapp); + launched[i] = dapp; if( ! IS_PANELOFF(wmdock) ) { gtk_box_pack_start(GTK_BOX(wmdock->box), GTK_WIDGET(dapp->tile), FALSE, FALSE, 0); @@ -112,9 +121,28 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin) } } } - } /* rcCmds != NULL */ - xfce_rc_close (rc); + if( IS_PANELOFF(wmdock ) && g_strv_length(rcCmds) == g_strv_length(glueList) ) { + for (i = 0; glueList[i]; i++) { + if(!launched[i] || glueList[i][0] == '\0' || !(tokens = g_strsplit(glueList[i], ",", 0))) + continue; + + for (j = 0; tokens[j]; j++) { + n = g_ascii_strtoll(tokens[j], &glueName, 10); + if(n > G_MAXINT || n < 0 || n > g_strv_length(rcCmds)-1 || glueName == tokens[j]) + continue; + if((gluePos = wmdock_get_glue_position(glueName) == -1)) + continue; + + launched[i]->glue[gluePos] = launched[(gint) n]; + } + g_strfreev(tokens); + } + + g_strfreev(glueList); + } + g_free(launched); + } /* rcCmds != NULL */ } @@ -127,14 +155,15 @@ void wmdock_write_rc_file (XfcePanelPlugin *plugin) gchar buf[BUF_MAX]; GList *dapps; DockappNode *dapp = NULL; - gint i = 0, gluePos = 0, j = 0; + gint i = 0, gluePos = 0, n = 0; if (!(file = xfce_panel_plugin_save_location (plugin, TRUE))) return; rc = xfce_rc_simple_open (file, FALSE); g_free (file); - if (!rc) return; + if (!rc) + return; if(g_list_length (wmdock->dapps) > 0) { cmdList = g_malloc0(sizeof (gchar *) * (g_list_length (wmdock->dapps) + 1)); @@ -149,12 +178,12 @@ void wmdock_write_rc_file (XfcePanelPlugin *plugin) 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)); + if(dapp->glue[gluePos] && (n = g_list_index(wmdock->dapps, (gconstpointer) dapp->glue[gluePos])) != -1) { + /* ChildIndex1(n):position,ChildIndex2:postion,... */ + if(strnlen((const char *) buf, sizeof(buf)-1) > 0) + p = g_strdup_printf(",%d:%s", n, wmdock_get_glue_name(gluePos)); else - p = g_strdup_printf("%d:%s", j, get_glue_name(gluePos)); + p = g_strdup_printf("%d:%s", n, wmdock_get_glue_name(gluePos)); g_strlcat(buf, p, sizeof(buf)); g_free(p); } @@ -171,7 +200,6 @@ void wmdock_write_rc_file (XfcePanelPlugin *plugin) g_strfreev(glueList); } - 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); diff --git a/panel-plugin/wmdock.c b/panel-plugin/wmdock.c index cd95366..50420f9 100644 --- a/panel-plugin/wmdock.c +++ b/panel-plugin/wmdock.c @@ -56,7 +56,6 @@ GdkPixbuf *gdkPbTileDefault = NULL; GdkPixbuf *gdkPbIcon = NULL; WmdockPlugin *wmdock = NULL; gchar **rcCmds = NULL; -gint rcCmdcnt = 0; /* TODO: Set panel off to FALSE. */ gboolean rcPanelOff = TRUE; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits