diff -u --recursive xfwm4-4.2.1/defaults/defaults xfwm4-hacked/defaults/defaults --- xfwm4-4.2.1/defaults/defaults 2004-11-30 23:26:10.000000000 +0000 +++ xfwm4-hacked/defaults/defaults 2005-03-26 11:58:23.000000000 +0000 @@ -42,3 +42,4 @@ wrap_resistance=10 wrap_windows=true wrap_workspaces=false +shadow_opacity=66 diff -u --recursive xfwm4-4.2.1/mcs-plugin/xfwm4_plugin.c xfwm4-hacked/mcs-plugin/xfwm4_plugin.c --- xfwm4-4.2.1/mcs-plugin/xfwm4_plugin.c 2005-01-14 11:41:37.000000000 +0000 +++ xfwm4-hacked/mcs-plugin/xfwm4_plugin.c 2005-03-26 12:04:37.000000000 +0000 @@ -120,6 +120,13 @@ static int raise_delay; static int snap_width; static int wrap_resistance; + +static int shadow_opacity; +static int shadow_top_width; +static int shadow_bottom_width; +static int shadow_left_width; +static int shadow_right_width; + gchar *current_key_theme = NULL; static GList *decoration_theme_list = NULL; @@ -1375,6 +1382,66 @@ } } +static void +cb_shadow_tab_opacity_slider (GtkWidget * dialog, gpointer user_data) +{ + Itf *itf = (Itf *) user_data; + McsPlugin *mcs_plugin = itf->mcs_plugin; + + shadow_opacity = (int)gtk_range_get_value (GTK_RANGE (itf->shadow_tab_opacity_slider)); + mcs_manager_set_int (mcs_plugin->manager, "Xfwm/ShadowOpacity", CHANNEL1, shadow_opacity); + mcs_manager_notify (mcs_plugin->manager, CHANNEL1); + write_options (mcs_plugin); +} + +static void +cb_shadow_tab_top_offset_slider (GtkWidget * dialog, gpointer user_data) +{ + Itf *itf = (Itf *) user_data; + McsPlugin *mcs_plugin = itf->mcs_plugin; + + shadow_top_width = (int)gtk_range_get_value (GTK_RANGE (itf->shadow_tab_top_offset_slider)); + mcs_manager_set_int (mcs_plugin->manager, "Xfwm/ShadowTopOffset", CHANNEL1, shadow_top_width); + mcs_manager_notify (mcs_plugin->manager, CHANNEL1); + write_options (mcs_plugin); +} + +static void +cb_shadow_tab_bottom_offset_slider(GtkWidget * dialog, gpointer user_data) +{ + Itf *itf = (Itf *) user_data; + McsPlugin *mcs_plugin = itf->mcs_plugin; + + shadow_bottom_width = (int)gtk_range_get_value (GTK_RANGE (itf->shadow_tab_bottom_offset_slider)); + mcs_manager_set_int (mcs_plugin->manager, "Xfwm/ShadowBottomOffset", CHANNEL1, shadow_bottom_width); + mcs_manager_notify (mcs_plugin->manager, CHANNEL1); + write_options (mcs_plugin); +} + +static void +cb_shadow_tab_left_offset_slider (GtkWidget * dialog, gpointer user_data) +{ + Itf *itf = (Itf *) user_data; + McsPlugin *mcs_plugin = itf->mcs_plugin; + + shadow_left_width = (int)gtk_range_get_value (GTK_RANGE (itf->shadow_tab_left_offset_slider)); + mcs_manager_set_int (mcs_plugin->manager, "Xfwm/ShadowLeftOffset", CHANNEL1, shadow_left_width); + mcs_manager_notify (mcs_plugin->manager, CHANNEL1); + write_options (mcs_plugin); +} + +static void +cb_shadow_tab_right_offset_slider(GtkWidget * dialog, gpointer user_data) +{ + Itf *itf = (Itf *) user_data; + McsPlugin *mcs_plugin = itf->mcs_plugin; + + shadow_right_width = (int)gtk_range_get_value (GTK_RANGE (itf->shadow_tab_right_offset_slider)); + mcs_manager_set_int (mcs_plugin->manager, "Xfwm/ShadowRightOffset", CHANNEL1, shadow_right_width ); + mcs_manager_notify (mcs_plugin->manager, CHANNEL1); + write_options (mcs_plugin); +} + Itf * create_dialog (McsPlugin * mcs_plugin) { @@ -1395,6 +1462,8 @@ GtkWidget *vbox7; GtkWidget *vbox8; GtkWidget *vbox9; + GtkWidget *shadow_vbox; + GtkTreeViewColumn *hidden_column; GtkCellRenderer *renderer; @@ -1822,6 +1891,63 @@ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 3), label); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + /* I honestly have no idea how all this is supposed to work. + XFCE's biggest weakness is poorly commented code*/ + + /* Create a vertical box to organize the sliders */ + shadow_vbox = gtk_vbox_new (FALSE, BORDER); + gtk_container_set_border_width (GTK_CONTAINER (shadow_vbox), BORDER); + gtk_widget_show (shadow_vbox); + + gtk_container_add (GTK_CONTAINER (notebook), shadow_vbox); + + /* Label the notebook page */ + label = gtk_label_new (_("Shadows")); + gtk_widget_show (label); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 4), label); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + + /* Construct the sliders for changing the shadow options */ + dialog->shadow_tab_opacity_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (shadow_opacity, 0.0, 100.0, 10.0, 10.0, 0.0))); + dialog->shadow_tab_top_offset_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (shadow_top_width, -20, 20, 1, 1, 0))); + dialog->shadow_tab_bottom_offset_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (shadow_bottom_width, -20, 20, 1, 1, 0))); + dialog->shadow_tab_left_offset_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (shadow_left_width, -20, 20, 1, 1, 0))); + dialog->shadow_tab_right_offset_slider =gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (shadow_right_width, -20, 20, 1, 1, 0))); + /*dialog->shadow_tab_move_opacity_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 0.0, 100, 10, 10, 0))); + dialog->shadow_tab_resize_opacity_slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 0.0, 100, 10, 10, 0)));*/ + + /*Make the sliders visable*/ + gtk_widget_show(dialog->shadow_tab_opacity_slider); + gtk_widget_show(dialog->shadow_tab_top_offset_slider); + gtk_widget_show(dialog->shadow_tab_bottom_offset_slider); + gtk_widget_show(dialog->shadow_tab_left_offset_slider); + gtk_widget_show(dialog->shadow_tab_right_offset_slider); + + frame = xfce_framebox_new (_("Shadow Opacity"), TRUE); + gtk_box_pack_start (GTK_BOX (shadow_vbox), frame, TRUE, TRUE, 0); + xfce_framebox_add(XFCE_FRAMEBOX (frame), dialog->shadow_tab_opacity_slider); + gtk_widget_show (frame); + + frame = xfce_framebox_new (_("Top Shadow Width"), TRUE); + gtk_box_pack_start (GTK_BOX (shadow_vbox), frame, TRUE, TRUE, 0); + xfce_framebox_add(XFCE_FRAMEBOX (frame), dialog->shadow_tab_top_offset_slider); + gtk_widget_show (frame); + + frame = xfce_framebox_new (_("Bottom Shadow Width"), TRUE); + gtk_box_pack_start (GTK_BOX (shadow_vbox), frame, TRUE, TRUE, 0); + xfce_framebox_add(XFCE_FRAMEBOX (frame), dialog->shadow_tab_bottom_offset_slider); + gtk_widget_show (frame); + + frame = xfce_framebox_new (_("Left Shadow Width"), TRUE); + gtk_box_pack_start (GTK_BOX (shadow_vbox), frame, TRUE, TRUE, 0); + xfce_framebox_add(XFCE_FRAMEBOX (frame), dialog->shadow_tab_left_offset_slider); + gtk_widget_show (frame); + + frame = xfce_framebox_new (_("Right Shadow Width"), TRUE); + gtk_box_pack_start (GTK_BOX (shadow_vbox), frame, TRUE, TRUE, 0); + xfce_framebox_add(XFCE_FRAMEBOX (frame), dialog->shadow_tab_right_offset_slider); + gtk_widget_show (frame); + dialog->dialog_action_area1 = GTK_DIALOG (dialog->xfwm4_dialog)->action_area; gtk_widget_show (dialog->dialog_action_area1); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog->dialog_action_area1), GTK_BUTTONBOX_END); @@ -1914,6 +2040,12 @@ g_signal_connect (G_OBJECT (itf->box_move_check), "toggled", (GCallback) cb_box_move_changed, itf); g_signal_connect (G_OBJECT (itf->box_resize_check), "toggled", G_CALLBACK (cb_box_resize_changed), itf); + g_signal_connect (G_OBJECT (itf->shadow_tab_opacity_slider), "value_changed", (GCallback) cb_shadow_tab_opacity_slider, itf); + g_signal_connect (G_OBJECT (itf->shadow_tab_top_offset_slider), "value_changed", (GCallback) cb_shadow_tab_top_offset_slider, itf); + g_signal_connect (G_OBJECT (itf->shadow_tab_bottom_offset_slider), "value_changed", (GCallback) cb_shadow_tab_bottom_offset_slider, itf); + g_signal_connect (G_OBJECT (itf->shadow_tab_left_offset_slider), "value_changed", (GCallback) cb_shadow_tab_left_offset_slider, itf); + g_signal_connect (G_OBJECT (itf->shadow_tab_right_offset_slider), "value_changed", (GCallback) cb_shadow_tab_right_offset_slider, itf); + xfce_gtk_window_center_on_monitor_with_pointer (GTK_WINDOW (itf->xfwm4_dialog)); gtk_widget_show (itf->xfwm4_dialog); } @@ -2240,6 +2372,66 @@ mcs_manager_set_string (mcs_plugin->manager, "Xfwm/KeyThemeName", CHANNEL2, current_key_theme); } + + /*Get the current settings from xfwm4. This keeps the sliders from resetting to zero every time you + open the settings dialog.*/ + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Xfwm/ShadowOpacity", CHANNEL1); + if(setting) + { + shadow_opacity = setting->data.v_int; + } + else + { + printf("Error: falling back on default opacity\n"); + /*default value that I found in compositor.c Might as well use it here*/ + shadow_opacity = 66; + } + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Xfwm/ShadowTopOffset", CHANNEL1); + if(setting) + { + shadow_top_width = setting->data.v_int; + } + else + { + printf("Error: falling back on default top offset\n"); + shadow_top_width = 0; + } + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Xfwm/ShadowBottomOffset", CHANNEL1); + if(setting) + { + shadow_bottom_width = setting->data.v_int; + } + else + { + printf("Error: falling back on default top offset\n"); + shadow_bottom_width = 0; + } + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Xfwm/ShadowLeftOffset", CHANNEL1); + if(setting) + { + shadow_left_width = setting->data.v_int; + } + else + { + printf("Error: falling back on default top offset\n"); + shadow_left_width = 0; + } + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Xfwm/ShadowRightOffset", CHANNEL1); + if(setting) + { + shadow_right_width = setting->data.v_int; + } + else + { + printf("Error: falling back on default top offset\n"); + shadow_right_width = 0; + } + write_options (mcs_plugin); } diff -u --recursive xfwm4-4.2.1/mcs-plugin/xfwm4_plugin.h xfwm4-hacked/mcs-plugin/xfwm4_plugin.h --- xfwm4-4.2.1/mcs-plugin/xfwm4_plugin.h 2004-12-18 23:32:07.000000000 +0000 +++ xfwm4-hacked/mcs-plugin/xfwm4_plugin.h 2005-03-26 11:58:40.000000000 +0000 @@ -107,7 +107,15 @@ GtkWidget* popup_del_menuitem; GtkWidget* add_button; GtkWidget* del_button; - + + GtkWidget* shadow_tab_opacity_slider; + GtkWidget* shadow_tab_top_offset_slider; + GtkWidget* shadow_tab_bottom_offset_slider; + GtkWidget* shadow_tab_left_offset_slider; + GtkWidget* shadow_tab_right_offset_slider; + GtkWidget* shadow_tab_move_opacity_slider; + GtkWidget* shadow_tab_resize_opacity_slider; + }; enum diff -u --recursive xfwm4-4.2.1/src/client.c xfwm4-hacked/src/client.c --- xfwm4-4.2.1/src/client.c 2005-03-14 20:11:55.000000000 +0000 +++ xfwm4-hacked/src/client.c 2005-03-26 11:58:01.000000000 +0000 @@ -506,6 +506,7 @@ c->y = y; } + static void clientSetWidth (Client * c, int w1) { @@ -549,6 +550,24 @@ c->width = w1; } +/*Begin Brian's code*/ +void +clientUpdateAllShadows(ScreenInfo* screen_info) +{ + Client *c = NULL; + int i; + XWindowChanges wc; + + g_return_if_fail (screen_info != NULL); + + TRACE ("entering clientUpdateAllShadows"); + for (c = screen_info->clients, i = 0; i < screen_info->client_count; c = c->next, i++) + { + compositorWindowSetOpacity (screen_info->display_info, c->frame, (guint) (c->opacity )); + } +} +/*End Brian's code*/ + static void clientSetHeight (Client * c, int h1) { diff -u --recursive xfwm4-4.2.1/src/client.h xfwm4-hacked/src/client.h --- xfwm4-4.2.1/src/client.h 2004-12-30 22:08:37.000000000 +0000 +++ xfwm4-hacked/src/client.h 2005-03-26 11:58:04.000000000 +0000 @@ -259,6 +259,7 @@ #endif /* HAVE_LIBSTARTUP_NOTIFICATION */ }; +void clientUpdateAllShadows(ScreenInfo *); extern Client *clients; extern unsigned int client_count; diff -u --recursive xfwm4-4.2.1/src/compositor.c xfwm4-hacked/src/compositor.c --- xfwm4-4.2.1/src/compositor.c 2005-01-30 13:24:07.000000000 +0000 +++ xfwm4-hacked/src/compositor.c 2005-03-26 11:58:01.000000000 +0000 @@ -761,7 +761,7 @@ cw->shadow_dy = SHADOW_OFFSET_Y + screen_info->params->shadow_delta_y; if (!(cw->shadow)) { - double opacity = SHADOW_OPACITY; + double opacity = screen_info->params->shadow_opacity; if (cw->mode == WINDOW_TRANS) { opacity = opacity * ((double) cw->opacity) / ((double) NET_WM_OPAQUE); diff -u --recursive xfwm4-4.2.1/src/settings.c xfwm4-hacked/src/settings.c --- xfwm4-4.2.1/src/settings.c 2005-02-04 21:25:44.000000000 +0000 +++ xfwm4-hacked/src/settings.c 2005-03-26 12:05:08.000000000 +0000 @@ -239,6 +239,32 @@ { screen_info->params->box_resize = setting->data.v_int; } + + else if(!strcmp (name, "Xfwm/ShadowOpacity")) + { + screen_info->params->shadow_opacity = (double)(setting->data.v_int) / 100; + clientUpdateAllShadows(screen_info); + } + else if(!strcmp (name, "Xfwm/ShadowTopOffset")) + { + screen_info->params->shadow_delta_y = -setting->data.v_int; + clientUpdateAllShadows(screen_info); + } + else if(!strcmp (name, "Xfwm/ShadowBottomOffset")) + { + screen_info->params->shadow_delta_height = -setting->data.v_int; + clientUpdateAllShadows(screen_info); + } + else if(!strcmp (name, "Xfwm/ShadowLeftOffset")) + { + screen_info->params->shadow_delta_x = -setting->data.v_int; + clientUpdateAllShadows(screen_info); + } + else if(!strcmp (name, "Xfwm/ShadowRightOffset")) + { + screen_info->params->shadow_delta_width = -setting->data.v_int; + clientUpdateAllShadows(screen_info); + } } else if (setting->type == MCS_TYPE_STRING) { @@ -470,6 +496,40 @@ setIntValueFromInt ("resize_opacity", setting->data.v_int, rc); mcs_setting_free (setting); } + + /* I really have no idea what this does. I think it allows the mcs-plugin to query settings from xfwm4*/ + + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShadowOpacity", CHANNEL1, + &setting) == MCS_SUCCESS) + { + setIntValueFromInt("shadow_opacity", setting->data.v_int, rc); + mcs_setting_free (setting); + } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShadowTopOffset", CHANNEL1, + &setting) == MCS_SUCCESS) + { + setIntValueFromInt("shadow_delta_y", setting->data.v_int, rc); + mcs_setting_free (setting); + } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShadowBottomOffset", CHANNEL1, + &setting) == MCS_SUCCESS) + { + setIntValueFromInt("shadow_delta_height", setting->data.v_int, rc); + mcs_setting_free (setting); + } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShadowLeftOffset", CHANNEL1, + &setting) == MCS_SUCCESS) + { + setIntValueFromInt("shadow_delta_x", setting->data.v_int, rc); + mcs_setting_free (setting); + } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShadowRightOffset", CHANNEL1, + &setting) == MCS_SUCCESS) + { + setIntValueFromInt("shadow_delta_width", setting->data.v_int, rc); + mcs_setting_free (setting); + } + if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PreventFocusStealing", CHANNEL1, &setting) == MCS_SUCCESS) { @@ -661,13 +721,15 @@ parseRc (THEMERC, theme, rc); screen_info->params->shadow_delta_x = - abs (TOINT (getValue ("shadow_delta_x", rc))); + (TOINT (getValue ("shadow_delta_x", rc))); screen_info->params->shadow_delta_y = - abs (TOINT (getValue ("shadow_delta_y", rc))); + (TOINT (getValue ("shadow_delta_y", rc))); screen_info->params->shadow_delta_width = - abs (TOINT (getValue ("shadow_delta_width", rc))); + (TOINT (getValue ("shadow_delta_width", rc))); screen_info->params->shadow_delta_height = - abs (TOINT (getValue ("shadow_delta_height", rc))); + (TOINT (getValue ("shadow_delta_height", rc))); + screen_info->params->shadow_opacity = + (double)(TOINT (getValue ("shadow_opacity", rc))) / 100; for (i = 0; i < 20; i++) { @@ -1129,6 +1191,7 @@ {"shadow_delta_y", NULL, TRUE}, {"shadow_delta_width", NULL, TRUE}, {"shadow_delta_height", NULL, TRUE}, + {"shadow_opacity", NULL, TRUE}, {"theme", NULL, TRUE}, {"title_alignment", NULL, TRUE}, {"title_font", NULL, FALSE}, @@ -1261,7 +1324,13 @@ abs (TOINT (getValue ("move_opacity", rc))); screen_info->params->resize_opacity = abs (TOINT (getValue ("resize_opacity", rc))); - + + screen_info->params->shadow_delta_height = -TOINT (getValue ("shadow_delta_height", rc)); + screen_info->params->shadow_delta_width = TOINT (getValue ("shadow_delta_width", rc)); + screen_info->params->shadow_delta_x = TOINT (getValue ("shadow_delta_x", rc)); + screen_info->params->shadow_delta_y = -TOINT (getValue ("shadow_delta_y", rc)); + screen_info->params->shadow_opacity= (double)TOINT (getValue ("shadow_opacity", rc)) / 100; + screen_info->params->snap_to_border = !g_ascii_strcasecmp ("true", getValue ("snap_to_border", rc)); screen_info->params->snap_to_windows = diff -u --recursive xfwm4-4.2.1/src/settings.h xfwm4-hacked/src/settings.h --- xfwm4-4.2.1/src/settings.h 2004-11-30 23:26:10.000000000 +0000 +++ xfwm4-hacked/src/settings.h 2005-03-26 11:58:05.000000000 +0000 @@ -159,6 +159,7 @@ int shadow_delta_y; int shadow_delta_width; int shadow_delta_height; + double shadow_opacity; int title_alignment; int title_horizontal_offset; int wrap_resistance;