configuration.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. /**
  2. *
  3. * Copyright (c) 2002, Marc Bruenink
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright notice,
  13. * this list of conditions and the following disclaimer in the documentation
  14. * and/or other materials provided with the distribution.
  15. * 3. Neither the name of the author nor the names of his contributors may be
  16. * used to endorse or promote products derived from this software without
  17. * specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29. * POSSIBILITY OF SUCH DAMAGE.
  30. */
  31. #ifndef _TITLEFADER_CONFIG_H_
  32. #define _TITLEFADER_CONFIG_H_
  33. //#include <xmms/xmmsctrl.h>
  34. #include <xmms/configfile.h>
  35. #include <gtk/gtk.h>
  36. #include <string>
  37. #include <stdio.h> // sprintf
  38. #include "myhelpfunctions.h"
  39. #include "Xlib_textfader.h"
  40. //#include "positionsel.h"
  41. // error defines
  42. #define CONFIGCANNOTOPEN -1001
  43. // config defines
  44. // defines the upper value from the frame scale
  45. #define MAXFRAMESTOFADE 250
  46. #define XMMSCONFIGNAME "Title Fader Plugin"
  47. //pos_sel win = root window / POSSELCONFIGWIN2ROOTWIN
  48. #define POSSELCONFIGWIN2ROOTWIN 5
  49. class Config {
  50. private:
  51. GtkWidget *win;
  52. GtkWidget *hWinScale, *vWinScale;
  53. GtkWidget *color, *font;
  54. //positon selection drawable
  55. GtkWidget* pos_sel;
  56. GtkWidget *frameScale;
  57. // load help vars
  58. gchar *vAlignComboSelection, *hAlignComboSelection;
  59. // handler id to block changed signal in position selection
  60. guint pos_sel_changed_handler_id;
  61. // back image position selection
  62. GdkPixmap *pos_sel_pixmap;
  63. //PositionSel pos_sel;
  64. // xmms config file
  65. ConfigFile *confFile;
  66. // gtk widget alginment combos
  67. GtkWidget *vAlignCombo, *hAlignCombo;
  68. // i allways make a centered blending
  69. // to implement different fading position i've to correct
  70. // the x and y values.....
  71. int xCorrect, yCorrect;
  72. gchar *cArrangePoint;
  73. public:
  74. int vWinScalePos, hWinScalePos;
  75. int frameScalePos;
  76. unsigned long fadeOptions;
  77. // last selected color
  78. gdouble col_selected[4];
  79. // selected font
  80. gchar * font_selected;
  81. // width and height of position selection
  82. int pos_sel_width, pos_sel_height;
  83. int screen_width, screen_height;
  84. public:
  85. Config();
  86. ~Config();
  87. // show the configuration window
  88. int show();
  89. void hide();
  90. // button callbacks
  91. // buttons
  92. public:
  93. void main_ok_button_clicked();
  94. void main_test_button_clicked();
  95. void main_cancel_button_clicked();
  96. void main_center_button_clicked();
  97. void main_color_button_clicked() ;
  98. void main_font_button_clicked();
  99. void main_scale_value_changed(GtkWidget*);
  100. void color_cancel_button_clicked();
  101. void color_ok_button_clicked();
  102. void font_ok_button_clicked();
  103. void font_cancel_button_clicked();
  104. //position selector callbacks
  105. public:
  106. void pos_sel_motion_notified(GtkWidget*,GdkEventButton*);
  107. void pos_sel_exposed(GtkWidget*,GdkEventExpose*);
  108. void pos_sel_configure(GtkWidget*, GdkEventConfigure*);
  109. void pos_sel_mouse_released(GtkWidget*, GdkEventButton*);
  110. void main_pos_sel_combo_changed(GtkWidget*);
  111. private:
  112. void pos_sel_update(GtkWidget *widget, const int& x, const int&y);
  113. int read_values();
  114. int save_values();
  115. };
  116. /*
  117. some pseudo oop funtions
  118. button callbacks
  119. */
  120. static void st_main_ok_button_clicked(GtkWidget*, Config*);
  121. static void st_main_test_button_clicked(GtkWidget*, Config*);
  122. static void st_main_cancel_button_clicked(GtkWidget*, Config*);
  123. static void st_main_center_button_clicked(GtkWidget*, Config*);
  124. static void st_main_font_button_clicked(GtkWidget *widget, Config *object);
  125. static void st_main_color_button_clicked(GtkWidget *widget, Config *object);
  126. static void st_main_win_closed(GtkWidget*, Config*);
  127. static void st_color_cancel_button_clicked(GtkWidget *widget, Config *config);
  128. static void st_color_ok_button_clicked(GtkWidget *widget, Config *config);
  129. static void st_font_ok_button_clicked(GtkWidget *widget, Config *config);
  130. static void st_font_cancel_button_clicked(GtkWidget *widget, Config *config);
  131. static void st_main_scale_value_changed(GtkWidget*, Config*);
  132. /*
  133. yooo hoooo no O O (P)
  134. */
  135. static void st_pos_sel_motion_notified(GtkWidget*, GdkEventButton*,Config*);
  136. static gint st_pos_sel_exposed(GtkWidget*,GdkEventExpose* ,Config*);
  137. static void st_pos_sel_configure(GtkWidget*,GdkEventConfigure* ,Config*);
  138. static void st_pos_sel_mouse_released(GtkWidget*, GdkEventButton*, Config*);
  139. static void st_main_pos_sel_combo_changed(GtkWidget*, /*GdkEventAny*,*/ Config*);
  140. /*
  141. constructors
  142. */
  143. Config::Config() {
  144. win = NULL;
  145. screen_width = gdk_screen_width();
  146. pos_sel_width = screen_width / POSSELCONFIGWIN2ROOTWIN;
  147. screen_height = gdk_screen_height();
  148. pos_sel_height = screen_height / POSSELCONFIGWIN2ROOTWIN;
  149. /* load last values */
  150. xCorrect = 0;
  151. yCorrect = 0;
  152. col_selected[0]=1;
  153. col_selected[1]=1;
  154. col_selected[2]=1;
  155. col_selected[3]=1;
  156. font_selected = NULL;
  157. hWinScale = NULL;
  158. vWinScalePos = screen_height / 2;
  159. hWinScalePos = screen_width / 2;
  160. hAlignComboSelection = vAlignComboSelection = "center";
  161. frameScalePos = 60;
  162. fadeOptions = TF_COORDINATES_CENTER_CENTER;
  163. read_values();
  164. }
  165. /*
  166. destructor
  167. */
  168. Config::~Config() {
  169. g_free(font_selected);
  170. gtk_widget_destroy(GTK_WIDGET(win));
  171. }
  172. /*
  173. show main configuration window
  174. */
  175. int Config::show() {
  176. GtkWidget *hBox, *vBox, *vBox2, *hBox2;
  177. GtkWidget *button;
  178. // GtkWidget *frameScale;
  179. GtkObject *adj;
  180. GtkWidget *table, *frame;
  181. //GtkWidget *vWinScale, *hWinScale;
  182. GtkWidget *label;
  183. GList *glist=NULL;
  184. read_values();
  185. if (win != NULL) return 1;
  186. // create window
  187. win = gtk_window_new(GTK_WINDOW_DIALOG);
  188. gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &win);
  189. gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(st_main_win_closed), this);
  190. // gtk_signal_connect(GTK_OBJECT
  191. gtk_window_set_title(GTK_WINDOW(win), "Title Fader Plugin - Configuration");
  192. gtk_container_set_border_width (GTK_CONTAINER (win), 15);
  193. vBox = gtk_vbox_new(FALSE, 10);
  194. gtk_container_add(GTK_CONTAINER(win), vBox);
  195. // Color + Font + position row
  196. hBox = gtk_hbox_new(FALSE, 10);
  197. gtk_box_pack_start(GTK_BOX(vBox), hBox, FALSE, FALSE, 0);
  198. // position selection
  199. frame = gtk_frame_new("Position Selection");
  200. gtk_box_pack_start(GTK_BOX(hBox), frame, FALSE, FALSE, 0);
  201. table = gtk_table_new(6, 3, FALSE);
  202. gtk_container_add(GTK_CONTAINER(frame), table);
  203. label = gtk_label_new("Just play around. You'll get it!!\nThe management of different sizes of the fade-window is influenced by your alignment choice.\n");
  204. gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
  205. gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
  206. gtk_table_attach((GtkTable*)table, label, 0, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 10, 10);
  207. gtk_widget_show(label);
  208. //position selection visualization
  209. pos_sel = gtk_drawing_area_new();
  210. gtk_drawing_area_size(GTK_DRAWING_AREA(pos_sel), pos_sel_width, pos_sel_height);
  211. gtk_widget_set_events (pos_sel, GDK_EXPOSURE_MASK
  212. | GDK_BUTTON_PRESS_MASK
  213. | GDK_BUTTON_MOTION_MASK
  214. | GDK_POINTER_MOTION_HINT_MASK);
  215. gtk_signal_connect (GTK_OBJECT (pos_sel), "expose_event", (GtkSignalFunc)st_pos_sel_exposed, this);
  216. gtk_signal_connect (GTK_OBJECT(pos_sel),"configure_event", (GtkSignalFunc) st_pos_sel_configure, this);
  217. gtk_signal_connect (GTK_OBJECT (pos_sel), "motion_notify_event", (GtkSignalFunc)st_pos_sel_motion_notified, this);
  218. gtk_signal_connect (GTK_OBJECT (pos_sel), "button_press_event", (GtkSignalFunc)st_pos_sel_mouse_released, this);
  219. // gtk_signal_connect (GTK_OBJECT (pos_sel.pixmap), "button_press_event", (GtkSignalFunc)st_pos_sel_button_pressed, NULL);
  220. gtk_table_attach((GtkTable*)table, pos_sel, 0, 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 10, 10);
  221. // hWinScale
  222. adj = gtk_adjustment_new(hWinScalePos,0, screen_width,1,10,0);
  223. gtk_signal_connect(GTK_OBJECT(adj), "value_changed", GTK_SIGNAL_FUNC(st_main_scale_value_changed), this);
  224. hWinScale = gtk_hscale_new((GtkAdjustment*)adj);
  225. gtk_scale_set_draw_value((GtkScale*)hWinScale, TRUE );
  226. gtk_scale_set_digits((GtkScale*)hWinScale, 0);
  227. gtk_scale_set_value_pos((GtkScale*)hWinScale, GTK_POS_TOP);
  228. gtk_table_attach_defaults((GtkTable*)table, hWinScale, 0, 1, 2, 3);
  229. gtk_widget_show(hWinScale);
  230. // vWinScale
  231. adj = gtk_adjustment_new(vWinScalePos,0,screen_height,1,10,0);
  232. gtk_signal_connect(GTK_OBJECT(adj), "value_changed", GTK_SIGNAL_FUNC(st_main_scale_value_changed), this);
  233. vWinScale = gtk_vscale_new((GtkAdjustment*)adj);
  234. gtk_scale_set_draw_value((GtkScale*)hWinScale, TRUE );
  235. gtk_scale_set_digits((GtkScale*)vWinScale, 0);
  236. gtk_scale_set_value_pos((GtkScale*)vWinScale, GTK_POS_LEFT);
  237. gtk_table_attach((GtkTable*)table, vWinScale, 1, 2, 1, 2, GTK_EXPAND, GTK_FILL, 10, 0);
  238. gtk_widget_show(vWinScale);
  239. hBox2 = gtk_hbox_new(FALSE, 10);
  240. gtk_table_attach((GtkTable*)table, hBox2, 0, 3, 3, 4, GTK_EXPAND, GTK_EXPAND, 10, 10);
  241. label = gtk_label_new("choose v-alignment: ");
  242. gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
  243. gtk_box_pack_start(GTK_BOX(hBox2), label, FALSE, FALSE, 0);
  244. gtk_widget_show(label);
  245. vAlignCombo = gtk_combo_new();
  246. gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(vAlignCombo)->entry), FALSE);
  247. //glist = g_list_alloc();
  248. glist = g_list_append(glist, (void*)"above");
  249. glist = g_list_append(glist,(void*) "center");
  250. glist = g_list_append(glist, (void*)"under");
  251. gtk_combo_set_popdown_strings(GTK_COMBO(vAlignCombo), glist) ;
  252. g_list_free(glist);
  253. glist = NULL;
  254. gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(vAlignCombo)->entry), vAlignComboSelection);
  255. main_pos_sel_combo_changed(GTK_COMBO(vAlignCombo)->entry);
  256. gtk_box_pack_start(GTK_BOX(hBox2), vAlignCombo, FALSE, FALSE, 0);
  257. gtk_signal_connect(GTK_OBJECT(GTK_COMBO(vAlignCombo)->entry), "changed", GTK_SIGNAL_FUNC(st_main_pos_sel_combo_changed), this);
  258. gtk_widget_show(vAlignCombo);
  259. gtk_widget_show(hBox2);
  260. hBox2 = gtk_hbox_new(FALSE, 10);
  261. gtk_table_attach((GtkTable*)table, hBox2, 0, 3, 4, 5, GTK_EXPAND, GTK_EXPAND, 10, 10);
  262. label = gtk_label_new("choose h-alignment: ");
  263. gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
  264. gtk_box_pack_start(GTK_BOX(hBox2), label, FALSE, FALSE, 0);
  265. gtk_widget_show(label);
  266. hAlignCombo = gtk_combo_new();
  267. gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(hAlignCombo)->entry), FALSE);
  268. //glist = g_list_alloc();
  269. glist = g_list_append(glist, (void*)"left");
  270. glist = g_list_append(glist,(void*) "center");
  271. glist = g_list_append(glist, (void*)"right");
  272. gtk_combo_set_popdown_strings(GTK_COMBO(hAlignCombo), glist) ;
  273. g_list_free(glist);
  274. glist = NULL;
  275. gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(hAlignCombo)->entry), hAlignComboSelection);
  276. main_pos_sel_combo_changed(GTK_COMBO(hAlignCombo)->entry);
  277. gtk_box_pack_start(GTK_BOX(hBox2), hAlignCombo, FALSE, FALSE, 0);
  278. gtk_signal_connect(GTK_OBJECT(GTK_COMBO(hAlignCombo)->entry), "changed", GTK_SIGNAL_FUNC(st_main_pos_sel_combo_changed), this);
  279. gtk_widget_show(hAlignCombo);
  280. gtk_widget_show(hBox2);
  281. button = gtk_button_new_with_label(" center ");
  282. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(st_main_center_button_clicked), this);
  283. gtk_table_attach((GtkTable*)table, button, 0, 1, 5, 6, GTK_FILL , GTK_FILL, 10, 10);
  284. gtk_widget_show(button);
  285. gtk_widget_show(frame);
  286. gtk_widget_show(table);
  287. // color + font
  288. //color
  289. vBox2 = gtk_vbox_new(FALSE, 10);
  290. gtk_box_pack_start(GTK_BOX(hBox), vBox2, FALSE, FALSE, 0);
  291. color = gtk_color_selection_dialog_new("Title Fader Plugin - Color");
  292. // set saved color!!
  293. GtkColorSelection *colorsel;
  294. colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color)->colorsel);
  295. //gtk_color_selection_get_color(colorsel, col_selected);
  296. gtk_color_selection_set_color(colorsel, col_selected);
  297. gtk_color_selection_set_opacity(colorsel, FALSE );
  298. // color dialog ok button
  299. gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color)->ok_button), "clicked", GTK_SIGNAL_FUNC(st_color_ok_button_clicked), this);
  300. // color dialog cancel button
  301. gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color)->cancel_button), "clicked", GTK_SIGNAL_FUNC(st_color_cancel_button_clicked), this);
  302. // color dialog help button
  303. // if you need help in a color selection dialog you're an idiot
  304. // so you're a normal user ;-)
  305. // but in fact if've not a good mind to create a help window.
  306. // it seems to be useless.
  307. // Soooooooo... Lets kill the help button
  308. gtk_widget_destroy(GTK_COLOR_SELECTION_DIALOG(color)->help_button);
  309. button = gtk_button_new_with_label(" choose color ");
  310. gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_show), GTK_OBJECT(color));
  311. gtk_box_pack_start(GTK_BOX(vBox2), button, FALSE, FALSE, 0);
  312. gtk_widget_show(button);
  313. //font selection
  314. font = gtk_font_selection_dialog_new("Title Fader Plugin - Font");
  315. gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font)->fontsel), font_selected);
  316. // font selection ok button
  317. gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font)->ok_button), "clicked", GTK_SIGNAL_FUNC(st_font_ok_button_clicked), this);
  318. // font selection cancel button
  319. gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font)->cancel_button), "clicked", GTK_SIGNAL_FUNC(st_font_cancel_button_clicked), this);
  320. button = gtk_button_new_with_label(" choose font ");
  321. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(st_main_font_button_clicked), this);
  322. gtk_box_pack_start(GTK_BOX(vBox2), button, FALSE, FALSE, 0);
  323. gtk_widget_show(button);
  324. gtk_widget_show(vBox2);
  325. gtk_widget_show(hBox);
  326. // frames row
  327. hBox = gtk_hbox_new(FALSE, 10);
  328. gtk_box_pack_start(GTK_BOX(vBox), hBox, TRUE, TRUE, 0);
  329. label = gtk_label_new("\nChoose the number of frames:");
  330. gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
  331. gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
  332. gtk_box_pack_start(GTK_BOX(hBox), label, FALSE, FALSE, 0);
  333. gtk_box_pack_start(GTK_BOX(hBox), NULL, TRUE, TRUE, 0);
  334. gtk_widget_show(label);
  335. gtk_widget_show(hBox);
  336. adj = gtk_adjustment_new( frameScalePos, 0, 250, 1, 10, 0 );
  337. frameScale = gtk_hscale_new((GtkAdjustment *)adj);
  338. gtk_scale_set_draw_value((GtkScale*)frameScale, TRUE );
  339. gtk_scale_set_digits((GtkScale*)frameScale, 0);
  340. gtk_box_pack_start(GTK_BOX(vBox), frameScale, FALSE, FALSE, 0);
  341. gtk_widget_show(frameScale);
  342. // button row
  343. hBox = gtk_hbox_new(FALSE, 10);
  344. gtk_box_pack_start(GTK_BOX(vBox), hBox, FALSE, FALSE, 0);
  345. button = gtk_button_new_with_label(" Test ");
  346. gtk_box_pack_start(GTK_BOX(hBox), button, FALSE, FALSE, 0);
  347. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(st_main_test_button_clicked), this);
  348. gtk_widget_show(button);
  349. button = gtk_button_new_with_label(" OK ");
  350. gtk_box_pack_start(GTK_BOX(hBox), button, FALSE, FALSE, 0);
  351. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(st_main_ok_button_clicked), this);
  352. gtk_widget_show(button);
  353. button = gtk_button_new_with_label(" Cancel ");
  354. gtk_box_pack_start(GTK_BOX(hBox), button, FALSE, FALSE, 0);
  355. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(st_main_cancel_button_clicked), this);
  356. gtk_widget_show(button);
  357. gtk_widget_show(hBox);
  358. gtk_widget_show(vBox);
  359. // free of charge
  360. gtk_widget_show_all (win);
  361. pos_sel_update(pos_sel, hWinScalePos/ POSSELCONFIGWIN2ROOTWIN, vWinScalePos / POSSELCONFIGWIN2ROOTWIN);
  362. }
  363. void Config::hide() {
  364. // gtk_widget_destroy(win);
  365. //win = NULL;
  366. gtk_widget_destroy(hWinScale);
  367. hWinScale = NULL;
  368. gtk_widget_destroy(vWinScale);
  369. vWinScale = NULL;
  370. gtk_widget_destroy(color);
  371. color = NULL;
  372. gtk_widget_destroy(font);
  373. font = NULL;
  374. gtk_widget_destroy(pos_sel);
  375. pos_sel = NULL;
  376. }
  377. /*
  378. main configuration window button callbacks
  379. */
  380. static void st_main_win_closed(GtkWidget*, Config *conf) {
  381. conf ->hide();
  382. }
  383. static void st_main_ok_button_clicked(GtkWidget *widget, Config *object){
  384. object->main_ok_button_clicked();
  385. }
  386. static void st_main_test_button_clicked(GtkWidget *widget, Config *object){
  387. object->main_test_button_clicked();
  388. }
  389. static void st_main_cancel_button_clicked(GtkWidget *widget, Config *object){
  390. object->main_cancel_button_clicked();
  391. }
  392. static void st_main_center_button_clicked(GtkWidget *widget, Config *object){
  393. object->main_center_button_clicked();
  394. }
  395. static void st_main_color_button_clicked(GtkWidget *widget, Config *object){
  396. object->main_color_button_clicked();
  397. }
  398. static void st_main_font_button_clicked(GtkWidget *widget, Config *object){
  399. object->main_font_button_clicked();
  400. }
  401. static void st_main_scale_value_changed(GtkWidget *widget, Config *config){
  402. config->main_scale_value_changed(widget);
  403. }
  404. void Config::main_ok_button_clicked() {
  405. //save!!
  406. // reset plugin!!
  407. hWinScalePos = (int)gtk_range_get_adjustment(GTK_RANGE(hWinScale))->value;
  408. vWinScalePos = (int)gtk_range_get_adjustment(GTK_RANGE(vWinScale))->value;
  409. frameScalePos = (int)gtk_range_get_adjustment(GTK_RANGE(frameScale))->value;
  410. save_values();
  411. // implicit call of hide()
  412. gtk_widget_destroy(win);
  413. win = NULL;
  414. }
  415. void Config::main_test_button_clicked() {
  416. if (font_selected == NULL) {
  417. return;
  418. }
  419. Xlib_textfader fader;
  420. fader.set_font(font_selected);
  421. fader.set_text_color(col_selected[0], col_selected[1], col_selected[2]);
  422. fader.set_fade_position(gtk_range_get_adjustment(GTK_RANGE(hWinScale))->value, gtk_range_get_adjustment(GTK_RANGE(vWinScale))->value);
  423. fader.fade("Test button clicked!!", 21, gtk_range_get_adjustment(GTK_RANGE(frameScale))->value, fadeOptions);
  424. }
  425. void Config::main_cancel_button_clicked() {
  426. read_values();
  427. gtk_widget_destroy(win);
  428. win= NULL;
  429. }
  430. void Config::main_center_button_clicked() {
  431. GtkAdjustment *adj;
  432. // block changed signal
  433. //gtk_signal_handler_block_by_func(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(vWinScale))), GTK_SIGNAL_FUNC(st_main_scale_value_changed),NULL);
  434. adj = gtk_range_get_adjustment((GtkRange*)vWinScale);
  435. gtk_adjustment_set_value(adj, (adj->upper - adj->lower) / 2);
  436. //gtk_signal_emit_stop_by_name(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(vWinScale))), "value_changed");
  437. //gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(vWinScale))), GTK_SIGNAL_FUNC(st_main_scale_value_changed),NULL);
  438. //gtk_signal_handler_block_by_func(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(hWinScale))), GTK_SIGNAL_FUNC(st_main_scale_value_changed),NULL);
  439. adj = gtk_range_get_adjustment((GtkRange*)hWinScale);
  440. gtk_adjustment_set_value(adj, (adj->upper - adj->lower) / 2);
  441. //gtk_signal_emit_stop_by_name(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(hWinScale))), "value_changed");
  442. //gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(hWinScale))), GTK_SIGNAL_FUNC(st_main_scale_value_changed),NULL);
  443. }
  444. void Config::main_font_button_clicked() {
  445. gtk_widget_show(font);
  446. }
  447. void Config::main_color_button_clicked() {
  448. // gtk_widget_show(color);
  449. }
  450. // scale values changed
  451. void Config::main_scale_value_changed(GtkWidget *widget) {
  452. pos_sel_update(pos_sel, gtk_range_get_adjustment(GTK_RANGE(hWinScale))->value / POSSELCONFIGWIN2ROOTWIN, gtk_range_get_adjustment(GTK_RANGE(vWinScale))->value / POSSELCONFIGWIN2ROOTWIN);
  453. }
  454. /*
  455. colorselectiondialog buttons
  456. */
  457. static void st_color_cancel_button_clicked(GtkWidget *widget, Config *object){
  458. object->color_cancel_button_clicked();
  459. }
  460. static void st_color_ok_button_clicked(GtkWidget *widget, Config *object){
  461. object->color_ok_button_clicked();
  462. }
  463. void Config::color_cancel_button_clicked(){
  464. GtkColorSelection *colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color)->colorsel);
  465. gtk_color_selection_set_color(colorsel, col_selected);
  466. gtk_widget_hide(color);
  467. }
  468. void Config::color_ok_button_clicked(){
  469. GtkColorSelection *colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color)->colorsel);
  470. gtk_color_selection_get_color(colorsel, col_selected);
  471. gtk_widget_hide(color);
  472. }
  473. /*
  474. font selection dialog button callbacks
  475. */
  476. static void st_font_ok_button_clicked(GtkWidget * widget, Config *config) {
  477. config->font_ok_button_clicked();
  478. }
  479. static void st_font_cancel_button_clicked(GtkWidget * widget, Config *config) {
  480. config->font_cancel_button_clicked();
  481. }
  482. void Config::font_ok_button_clicked() {
  483. g_free(font_selected);
  484. GtkFontSelection *fontsel = GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font)->fontsel);
  485. font_selected = gtk_font_selection_get_font_name(fontsel);
  486. gtk_widget_hide(font);
  487. }
  488. void Config::font_cancel_button_clicked() {
  489. GtkFontSelection *fontsel = GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font)->fontsel);
  490. gtk_font_selection_set_font_name(fontsel, font_selected);
  491. gtk_widget_hide(font);
  492. }
  493. /*
  494. position selector callbacks
  495. */
  496. static void st_pos_sel_motion_notified(GtkWidget* widget, GdkEventButton *event, Config* config){
  497. config->pos_sel_motion_notified(widget, event);
  498. }
  499. static gint st_pos_sel_exposed(GtkWidget* widget,GdkEventExpose *event, Config* config){
  500. config->pos_sel_exposed(widget,event);
  501. return TRUE;
  502. }
  503. static void st_pos_sel_configure(GtkWidget* widget, GdkEventConfigure *event, Config* config){
  504. config->pos_sel_configure(widget, event);
  505. }
  506. static void st_pos_sel_mouse_released(GtkWidget* widget, GdkEventButton *event, Config* config){
  507. config->pos_sel_mouse_released(widget, event);
  508. }
  509. static void st_main_pos_sel_combo_changed(GtkWidget* widget, /*GdkEventAny* event,*/ Config* config) {
  510. config->main_pos_sel_combo_changed(widget/*, event*/);
  511. }
  512. void Config::pos_sel_motion_notified(GtkWidget *widget, GdkEventButton *event){
  513. gint x, y;
  514. gtk_widget_get_pointer (widget, &x, &y);
  515. gtk_adjustment_set_value(gtk_range_get_adjustment((GtkRange*)vWinScale), y * POSSELCONFIGWIN2ROOTWIN);
  516. gtk_adjustment_set_value(gtk_range_get_adjustment((GtkRange*)hWinScale), x * POSSELCONFIGWIN2ROOTWIN);
  517. // pos_sel_update(widget, x, y);
  518. }
  519. void Config::pos_sel_mouse_released(GtkWidget *widget, GdkEventButton *event){
  520. gint x, y;
  521. gtk_widget_get_pointer (widget, &x, &y);
  522. gtk_adjustment_set_value(gtk_range_get_adjustment((GtkRange*)vWinScale), y * POSSELCONFIGWIN2ROOTWIN);
  523. gtk_adjustment_set_value(gtk_range_get_adjustment((GtkRange*)hWinScale), x * POSSELCONFIGWIN2ROOTWIN);
  524. // pos_sel_update(widget, x, y);
  525. // value changed soo implicit call of pos_sel_update
  526. }
  527. void Config::pos_sel_exposed(GtkWidget *widget, GdkEventExpose *event){
  528. // gdk_draw_pixmap(widget->window, widget->style->black_gc, pos_sel_pixmap ,0,0,0, 0, 100, 100);
  529. gdk_draw_pixmap(widget->window,
  530. widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
  531. pos_sel_pixmap,
  532. event->area.x, event->area.y,
  533. event->area.x, event->area.y,
  534. event->area.width, event->area.height);
  535. }
  536. void Config::pos_sel_configure(GtkWidget *widget, GdkEventConfigure *event) {
  537. if (pos_sel_pixmap)
  538. gdk_pixmap_unref(pos_sel_pixmap);
  539. pos_sel_pixmap = gdk_pixmap_new(widget->window,
  540. widget->allocation.width,
  541. widget->allocation.height,
  542. -1);
  543. pos_sel_update(widget, 0, 0);
  544. }
  545. void Config::main_pos_sel_combo_changed(GtkWidget* widget/*, GdkEventAny *event*/) {
  546. std::string str;
  547. // xy position corrections
  548. str =(std::string)gtk_entry_get_text(GTK_ENTRY(widget));
  549. // hey which fucking widget was changed ??
  550. if (widget == GTK_COMBO(vAlignCombo)->entry) {
  551. if (str == "under") {
  552. yCorrect = 5;
  553. if ((fadeOptions & TF_COORDINATES_CENTER_LEFT) ||
  554. (fadeOptions & TF_COORDINATES_LOWER_LEFT)) {
  555. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_LEFT);
  556. }else
  557. if ((fadeOptions & TF_COORDINATES_CENTER_CENTER) ||
  558. (fadeOptions & TF_COORDINATES_LOWER_CENTER)) {
  559. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_CENTER);
  560. }else
  561. if((fadeOptions & TF_COORDINATES_CENTER_RIGHT) ||
  562. (fadeOptions & TF_COORDINATES_LOWER_RIGHT)) {
  563. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_RIGHT);
  564. }
  565. }
  566. if (str == "above") {
  567. yCorrect = -5;
  568. if ((fadeOptions & TF_COORDINATES_UPPER_LEFT) ||
  569. (fadeOptions & TF_COORDINATES_CENTER_LEFT)) {
  570. fadeOptions = TF_COORDINATES_SET (fadeOptions, TF_COORDINATES_LOWER_LEFT);
  571. }else
  572. if ((fadeOptions & TF_COORDINATES_UPPER_CENTER) ||
  573. (fadeOptions & TF_COORDINATES_CENTER_CENTER)) {
  574. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_LOWER_CENTER);
  575. }else
  576. if ((fadeOptions & TF_COORDINATES_UPPER_RIGHT) ||
  577. (fadeOptions & TF_COORDINATES_CENTER_RIGHT)) {
  578. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_LOWER_RIGHT);
  579. }
  580. }
  581. if (str == "center") {
  582. yCorrect = 0;
  583. if ((fadeOptions & TF_COORDINATES_UPPER_LEFT) ||
  584. (fadeOptions & TF_COORDINATES_LOWER_LEFT)) {
  585. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_LEFT);
  586. }else
  587. if ((fadeOptions & TF_COORDINATES_UPPER_CENTER) ||
  588. (fadeOptions & TF_COORDINATES_LOWER_CENTER)) {
  589. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_CENTER);
  590. }else
  591. if ((fadeOptions &TF_COORDINATES_UPPER_RIGHT) ||
  592. (fadeOptions & TF_COORDINATES_LOWER_RIGHT)) {
  593. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_RIGHT);
  594. }
  595. }
  596. }
  597. else if (widget == GTK_COMBO(hAlignCombo)->entry){
  598. if (str == "right") {
  599. xCorrect = 50;
  600. switch(TF_COORDINATES_GET(fadeOptions)) {
  601. case TF_COORDINATES_UPPER_CENTER:
  602. case TF_COORDINATES_UPPER_RIGHT:
  603. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_LEFT);
  604. break;
  605. case TF_COORDINATES_CENTER_CENTER:
  606. case TF_COORDINATES_CENTER_RIGHT:
  607. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_LEFT);
  608. break;
  609. case TF_COORDINATES_LOWER_CENTER:
  610. case TF_COORDINATES_LOWER_RIGHT:
  611. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_LOWER_LEFT);
  612. break;
  613. }
  614. }else
  615. if(str == "left") {
  616. xCorrect= -50;
  617. switch(TF_COORDINATES_GET(fadeOptions)) {
  618. case TF_COORDINATES_UPPER_LEFT:
  619. case TF_COORDINATES_UPPER_CENTER:
  620. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_RIGHT);
  621. break;
  622. case TF_COORDINATES_CENTER_LEFT:
  623. case TF_COORDINATES_CENTER_CENTER:
  624. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_RIGHT);
  625. break;
  626. case TF_COORDINATES_LOWER_LEFT:
  627. case TF_COORDINATES_LOWER_CENTER:
  628. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_LOWER_RIGHT);
  629. break;
  630. }
  631. }else
  632. if (str == "center") {
  633. xCorrect = 0;
  634. switch(TF_COORDINATES_GET(fadeOptions)) {
  635. case TF_COORDINATES_UPPER_LEFT:
  636. case TF_COORDINATES_UPPER_RIGHT:
  637. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_UPPER_CENTER);
  638. break;
  639. case TF_COORDINATES_CENTER_LEFT:
  640. case TF_COORDINATES_CENTER_RIGHT:
  641. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_CENTER_CENTER);
  642. break;
  643. case TF_COORDINATES_LOWER_LEFT:
  644. case TF_COORDINATES_LOWER_RIGHT:
  645. fadeOptions = TF_COORDINATES_SET(fadeOptions, TF_COORDINATES_LOWER_CENTER);
  646. break;
  647. }
  648. }
  649. }
  650. // complications: the life becomes meaningful ;)
  651. pos_sel_update(pos_sel, gtk_range_get_adjustment(GTK_RANGE(hWinScale))->value / POSSELCONFIGWIN2ROOTWIN, gtk_range_get_adjustment(GTK_RANGE(vWinScale))->value / POSSELCONFIGWIN2ROOTWIN);
  652. }
  653. /*
  654. private functions
  655. */
  656. int Config::read_values(){
  657. ConfigFile *conf;
  658. gchar *cBuffer;
  659. if(!(conf = xmms_cfg_open_default_file())) {
  660. return CONFIGCANNOTOPEN;
  661. }
  662. if(xmms_cfg_read_string(conf, "TitleFader", "color-red", &cBuffer)){
  663. col_selected[0] = atoi(cBuffer);
  664. g_free(cBuffer);
  665. }
  666. if(xmms_cfg_read_string(conf, "TitleFader", "color-green", &cBuffer)) {
  667. col_selected[1] = atoi(cBuffer);
  668. g_free(cBuffer);
  669. }
  670. if(xmms_cfg_read_string(conf, "TitleFader", "color-blue", &cBuffer)) {
  671. col_selected[2] = atoi(cBuffer);
  672. g_free(cBuffer);
  673. }
  674. if(xmms_cfg_read_string(conf, "TitleFader", "font", &cBuffer)) {
  675. font_selected = cBuffer;
  676. cBuffer = NULL;
  677. }
  678. if(xmms_cfg_read_string(conf, "TitleFader", "vAlignComboSelection", &cBuffer)){
  679. vAlignComboSelection = cBuffer;
  680. }
  681. if(xmms_cfg_read_string(conf, "TitleFader", "hAlignComboSelection", &cBuffer)) {
  682. hAlignComboSelection = cBuffer;
  683. }
  684. if (xmms_cfg_read_string(conf, "TitleFader", "vWinScalePos", &cBuffer)){
  685. vWinScalePos = atoi(cBuffer);
  686. g_free(cBuffer);
  687. }
  688. if (xmms_cfg_read_string(conf, "TitleFader", "hWinScalePos", &cBuffer)) {
  689. hWinScalePos = atoi (cBuffer);
  690. g_free(cBuffer);
  691. }
  692. if (xmms_cfg_read_string(conf, "TitleFader", "frameScalePos", &cBuffer)) {
  693. frameScalePos = atoi(cBuffer);
  694. g_free(cBuffer);
  695. }
  696. if (xmms_cfg_read_string(conf, "TitleFader", "fadeoptions", &cBuffer)) {
  697. fadeOptions = atol(cBuffer);
  698. g_free(cBuffer);
  699. }
  700. xmms_cfg_free(conf);
  701. }
  702. int Config::save_values(){
  703. ConfigFile *conf;
  704. char *cBuffer= new char[sizeof(float) * 8 + 1];
  705. if (!(conf = xmms_cfg_open_default_file())) {
  706. return CONFIGCANNOTOPEN;
  707. }
  708. sprintf(cBuffer, "%f", (float)col_selected[0]);
  709. xmms_cfg_write_string(conf, "TitleFader", "color-red", cBuffer);
  710. sprintf(cBuffer, "%f", (float)col_selected[1]);
  711. xmms_cfg_write_string(conf, "TitleFader", "color-green", cBuffer);
  712. sprintf(cBuffer, "%f", (float)col_selected[2]);
  713. xmms_cfg_write_string(conf, "TitleFader", "color-blue", cBuffer);
  714. // font save
  715. g_free(cBuffer);
  716. cBuffer = gtk_font_selection_get_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font)->fontsel));
  717. xmms_cfg_write_string(conf, "TitleFader", "font", cBuffer);
  718. g_free(cBuffer);
  719. //save fade position
  720. cBuffer = new char[sizeof(int) * 8 + 1];
  721. sprintf(cBuffer, "%i",(int)((gtk_range_get_adjustment(GTK_RANGE(hWinScale)))->value));
  722. xmms_cfg_write_string(conf, "TitleFader", "hWinScalePos", cBuffer);
  723. sprintf(cBuffer, "%i", (int)((gtk_range_get_adjustment(GTK_RANGE(vWinScale)))->value));
  724. xmms_cfg_write_string(conf, "TitleFader", "vWinScalePos", cBuffer);
  725. sprintf(cBuffer, "%i", (int)((gtk_range_get_adjustment(GTK_RANGE(frameScale)))->value));
  726. xmms_cfg_write_string(conf, "TitleFader", "frameScalePos", cBuffer);
  727. g_free(cBuffer);
  728. // save alignment
  729. // don't free because its a pointer upon a pointer
  730. cBuffer = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(hAlignCombo)->entry));
  731. xmms_cfg_write_string(conf, "TitleFader", "hAlignComboSelection", cBuffer);
  732. cBuffer = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(vAlignCombo)->entry));
  733. xmms_cfg_write_string(conf, "TitleFader", "vAlignComboSelection", cBuffer);
  734. cBuffer = new char[sizeof(long) * 8 + 1];
  735. sprintf(cBuffer, "%u", fadeOptions);
  736. xmms_cfg_write_string(conf, "TitleFader", "fadeOptions", cBuffer);
  737. g_free(cBuffer);
  738. // at the end: save it !!
  739. xmms_cfg_write_default_file(conf);
  740. xmms_cfg_free(conf);
  741. }
  742. void Config::pos_sel_update(GtkWidget *widget, const int &_x, const int &_y) {
  743. int x, y;
  744. GdkRectangle update_rect;
  745. // x y limiting
  746. x = _x>pos_sel_width-1 ? pos_sel_width : _x;
  747. x = _x<0 ? 0 : x;
  748. y = _y>pos_sel_height-1 ? pos_sel_height : _y;
  749. y = _y<0? 0: y;
  750. update_rect.x = 0;
  751. update_rect.y = 0;
  752. update_rect.width = pos_sel_width;
  753. update_rect.height = pos_sel_height;
  754. // bad delete change this!!
  755. gdk_draw_rectangle (pos_sel_pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
  756. gdk_draw_rectangle(pos_sel_pixmap, widget->style->black_gc, 0, x- 50 + xCorrect, y-5 + yCorrect, 100, 10);
  757. gdk_draw_line(pos_sel_pixmap, widget->style->black_gc, -1, y, x -50+ xCorrect, y);
  758. gdk_draw_line(pos_sel_pixmap, widget->style->black_gc, x + 50 + xCorrect, y, pos_sel_width, y);
  759. gdk_draw_line(pos_sel_pixmap, widget->style->black_gc, x, -1, x, y -5+ yCorrect);
  760. gdk_draw_line(pos_sel_pixmap, widget->style->black_gc, x, y +5+ yCorrect, x , pos_sel_height);
  761. gtk_widget_draw (widget, &update_rect);
  762. }
  763. #endif