no longer need ffmpeg patch0 which was for Termux
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / performanceprefs.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  * Copyright (C) 2003-2016 Cinelerra CV contributors
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 #include "bcsignals.h"
24 #include "clip.h"
25 #include "edl.h"
26 #include "edlsession.h"
27 #include "formattools.h"
28 #include "language.h"
29 #include "mwindow.h"
30 #include "performanceprefs.h"
31 #include "preferences.h"
32 #include <ctype.h>
33 #include <string.h>
34 #include "theme.h"
35
36 #define MASTER_NODE_FRAMERATE_TEXT "Master node framerate: %0.3f"
37 #if 0
38 N_(MASTER_NODE_FRAMERATE_TEXT)
39 #endif
40
41 PerformancePrefs::PerformancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
42  : PreferencesDialog(mwindow, pwindow)
43 {
44         hot_node = -1;
45 // *** CONTEXT_HELP ***
46         context_help_set_keyword("Performance");
47 }
48
49 PerformancePrefs::~PerformancePrefs()
50 {
51         delete brender_tools;
52         nodes[0].remove_all_objects();
53         nodes[1].remove_all_objects();
54         nodes[2].remove_all_objects();
55         nodes[3].remove_all_objects();
56 }
57
58 void PerformancePrefs::create_objects()
59 {
60         int xs5 = xS(5), xs10 = xS(10);
61         int ys5 = yS(5), ys10 = yS(10), ys20 = yS(20), ys30 = yS(30), ys35 = yS(35);
62         int x, y;
63         int xmargin2 = xS(180);
64         int xmargin3 = xS(260);
65         int xmargin4 = xS(420);
66         char string[BCTEXTLEN];
67         BC_Resources *resources = BC_WindowBase::get_resources();
68         BC_WindowBase *win;
69         BC_Title *title;
70
71         node_list = 0;
72         generate_node_list();
73
74         int xmargin1 = x = mwindow->theme->preferencesoptions_x;
75         y = mwindow->theme->preferencesoptions_y;
76
77         int y0 = y;
78         win = add_subwindow(new BC_Title(x, y + ys5, _("Cache size (MB):"), MEDIUMFONT, resources->text_default));
79         win->context_help_set_keyword("Performance section");
80         int maxw = win->get_w();
81         int y1 = y += ys30;
82         win = add_subwindow(new BC_Title(x, y1 + ys5, _("Seconds to preroll renders:")));
83         win->context_help_set_keyword("Performance section");
84         maxw = bmax(win->get_w(), maxw);
85         int x2 = x + maxw + xs5;
86         int y2 = y += ys30;
87         cache_size = new CICacheSize(x2, y0, pwindow, this);
88         cache_size->create_objects();
89         PrefsRenderPreroll *preroll = new PrefsRenderPreroll(pwindow, this, x2, y1);
90         preroll->create_objects();
91         add_subwindow(new PrefsForceUniprocessor(pwindow, x, y2));
92         y += ys30;
93
94         int x1 = x + xmargin4;
95         add_subwindow(cache_transitions = new CacheTransitions(x1, y0, pwindow, this));
96         cache_transitions->context_help_set_keyword("Performance section");
97         win = add_subwindow(new BC_Title(x1, y1, _("Use HW Device:")));
98         win->context_help_set_keyword("Performance section");
99         maxw = win->get_w();
100         win = add_subwindow(new BC_Title(x1, y2, _("Project SMP cpus:")));
101         win->context_help_set_keyword("Performance section");
102         maxw = bmax(win->get_w(), maxw);
103         x2 = x1 + maxw + xs5;
104         PrefsUseHWDev *use_hw_dev = new PrefsUseHWDev(pwindow, this, x2, y1);
105         use_hw_dev->create_objects();
106         PrefsProjectSMP *proj_smp = new PrefsProjectSMP(pwindow, this, x2, y2);
107         proj_smp->create_objects();
108
109 // Background rendering
110         add_subwindow(new BC_Bar(xs5, y, get_w() - xs10));
111         y += ys5;
112
113
114         add_subwindow(title = new BC_Title(x, y, _("Background Rendering (Video only)"), LARGEFONT, resources->text_default));
115         title->context_help_set_keyword("Background Rendering");
116         y1 = y += ys30;
117
118         win = add_subwindow(new PrefsUseBRender(pwindow, x, y));
119         win->context_help_set_keyword("Background Rendering");
120
121         y += win->get_h() + ys10;
122         win = add_subwindow(new BC_Title(x, y, _("Frames per background rendering job:")));
123         win->context_help_set_keyword("Background Rendering");
124         y += win->get_h() + ys5;
125         PrefsBRenderFragment *brender_fragment = new PrefsBRenderFragment(pwindow, this,
126                 x + xmargin3, y);
127         brender_fragment->create_objects();
128         y += brender_fragment->get_h() + ys5;
129         win = add_subwindow(new BC_Title(x, y, _("Frames to preroll background:")));
130         win->context_help_set_keyword("Background Rendering");
131         y += win->get_h() + ys5;
132         PrefsBRenderPreroll *bpreroll = new PrefsBRenderPreroll(pwindow, this,
133                 x + xmargin3, y + ys5);
134         bpreroll->create_objects();
135         y += bpreroll->get_h() + ys20;
136
137         x += xmargin4;
138         add_subwindow(title = new BC_Title(x, y1, _("Output for background rendering:")));
139         title->context_help_set_keyword("Background Rendering");
140         y1 += ys20;
141         brender_tools = new FormatTools(mwindow, this,
142                         pwindow->thread->preferences->brender_asset);
143         brender_tools->create_objects(x, y1,
144                 0,  // Include tools for audio
145                 1,  // Include tools for video
146                 0,  // Include checkbox for audio
147                 0,  // Include checkbox for video
148                 0,
149                 1,
150                 0,  // Select compressors to be offered
151                 0,  // Prompt for recording options
152                 0,  // prompt for use labels
153                 1); // Supply file formats for background rendering
154         x = xmargin1;
155
156
157 // Renderfarm
158         add_subwindow(new BC_Bar(xs5, y, get_w() - xs10));
159         y += ys5;
160         add_subwindow(title = new BC_Title(x, y, _("Render Farm"), LARGEFONT, resources->text_default));
161         title->context_help_set_keyword("Render Farm Menu");
162         x1 = get_w() - BC_GenericButton::calculate_w(this, _("Reset rates")) - x;
163         add_subwindow(new PrefsRenderFarmReset(pwindow, this, x1, y));
164         x1 = x + xmargin4;
165         BC_Title *node_title = new BC_Title(x1, y, _("Nodes:"));
166         add_subwindow(node_title);
167         node_title->context_help_set_keyword("Render Farm Menu");
168         x1 += node_title->get_w() + xS(15);
169         sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
170                 pwindow->thread->preferences->local_rate);
171         add_subwindow(master_rate = new BC_Title(x1, y, string));
172         master_rate->context_help_set_keyword("Render Farm Menu");
173         add_subwindow(node_list = new PrefsRenderFarmNodes(pwindow, this, x + xmargin4, y+=yS(25)));
174         node_list->context_help_set_keyword("Render Farm Menu");
175         add_subwindow(new PrefsRenderFarm(pwindow, x, y+=ys5));
176         add_subwindow(title = new BC_Title(x, y+=ys30, _("Hostname:")));
177         title->context_help_set_keyword("Render Farm Menu");
178         add_subwindow(title = new BC_Title(x + xmargin3, y, _("Port:")));
179         title->context_help_set_keyword("Render Farm Menu");
180         add_subwindow(edit_node = new PrefsRenderFarmEditNode(pwindow, this, x, y+=yS(25)));
181         edit_node->context_help_set_keyword("Render Farm Menu");
182         edit_port = new PrefsRenderFarmPort(pwindow, this, x+xmargin3, y);
183         edit_port->create_objects();
184
185         add_subwindow(new PrefsRenderFarmReplaceNode(pwindow, this, x, y+=ys30));
186         add_subwindow(new PrefsRenderFarmNewNode(pwindow, this, x+xmargin2, y));
187         add_subwindow(new PrefsRenderFarmSortNodes(pwindow, this, x, y+=ys30));
188         add_subwindow(new PrefsRenderFarmDelNode(pwindow, this, x+xmargin2, y));
189         add_subwindow(title = new BC_Title(x, y+=ys35, _("Client Watchdog Timeout:")));
190         title->context_help_set_keyword("Render Farm Menu");
191         renderfarm_watchdog = new PrefsRenderFarmWatchdog(pwindow, this, x+xmargin3, y-ys5);
192         renderfarm_watchdog->create_objects();
193         add_subwindow(title = new BC_Title(x, y+=ys35, _("Total jobs to create:")));
194         title->context_help_set_keyword("Render Farm Menu");
195         PrefsRenderFarmJobs *jobs = new PrefsRenderFarmJobs(pwindow, this,
196                 x + xmargin3, y-ys5);
197         jobs->create_objects();
198         y += jobs->get_h() + ys5;
199         win = add_subwindow(new BC_Title(x, y,
200                 _("(overridden if new file at each label is checked)")));
201         win->context_help_set_keyword("Render Farm Menu");
202 //      y += win->get_h() + ys5;
203 //      add_subwindow(new PrefsRenderFarmVFS(pwindow, this, x, y));
204 //      add_subwindow(new BC_Title(x, y,
205 //              _("Filesystem prefix on remote nodes:")));
206 //      add_subwindow(new PrefsRenderFarmMountpoint(pwindow, this, x + xmargin3, y));
207 //      y += ys30;
208 }
209
210 void PerformancePrefs::generate_node_list()
211 {
212         int selected_row = node_list ? node_list->get_selection_number(0, 0) : -1;
213
214         for(int i = 0; i < TOTAL_COLUMNS; i++)
215                 nodes[i].remove_all_objects();
216
217         for(int i = 0;
218                 i < pwindow->thread->preferences->renderfarm_nodes.size();
219                 i++)
220         {
221                 BC_ListBoxItem *item;
222                 nodes[ENABLED_COLUMN].append(item = new BC_ListBoxItem(
223                         (char*)(pwindow->thread->preferences->renderfarm_enabled.get(i) ? "X" : " ")));
224                 if(i == selected_row) item->set_selected(1);
225
226                 nodes[HOSTNAME_COLUMN].append(item = new BC_ListBoxItem(
227                         pwindow->thread->preferences->renderfarm_nodes.get(i)));
228                 if(i == selected_row) item->set_selected(1);
229
230                 char string[BCTEXTLEN];
231                 sprintf(string, "%d", pwindow->thread->preferences->renderfarm_ports.get(i));
232                 nodes[PORT_COLUMN].append(item = new BC_ListBoxItem(string));
233                 if(i == selected_row) item->set_selected(1);
234
235                 sprintf(string, "%0.3f", pwindow->thread->preferences->renderfarm_rate.get(i));
236                 nodes[RATE_COLUMN].append(item = new BC_ListBoxItem(string));
237                 if(i == selected_row) item->set_selected(1);
238         }
239 }
240
241
242 static const char *default_titles[] = {
243         N_("On"), N_("Hostname"), N_("Port"), N_("Framerate")
244 };
245
246 static int default_widths[] = {
247         30, 150, 50, 50
248 };
249
250
251 void PerformancePrefs::update_node_list()
252 {
253         node_list->update_list();
254 }
255
256 void PrefsRenderFarmNodes::update_list()
257 {
258         update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
259                 get_xposition(), get_yposition(), get_selection_number(0, 0));
260 }
261
262
263 void PerformancePrefs::update_rates()
264 {
265 //printf("PerformancePrefs::update_rates %d\n", __LINE__);
266         char string[BCTEXTLEN];
267         for(int i = 0;
268                 i < mwindow->preferences->renderfarm_rate.size();
269                 i++)
270         {
271                 if(i < nodes[RATE_COLUMN].size())
272                 {
273                         sprintf(string, "%0.3f", mwindow->preferences->renderfarm_rate.get(i));
274                         nodes[RATE_COLUMN].get(i)->set_text(string);
275                 }
276         }
277
278         sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
279                 mwindow->preferences->local_rate);
280         master_rate->update(string);
281
282         update_node_list();
283 }
284
285
286 PrefsUseBRender::PrefsUseBRender(PreferencesWindow *pwindow,
287         int x,
288         int y)
289  : BC_CheckBox(x,
290         y,
291         pwindow->thread->preferences->use_brender,
292         _("Use background rendering"))
293 {
294         this->pwindow = pwindow;
295 }
296
297 int PrefsUseBRender::handle_event()
298 {
299         pwindow->thread->redraw_overlays = 1;
300         pwindow->thread->redraw_times = 1;
301         pwindow->thread->preferences->use_brender = get_value();
302         return 1;
303 }
304
305
306 PrefsBRenderFragment::PrefsBRenderFragment(PreferencesWindow *pwindow,
307         PerformancePrefs *subwindow, int x, int y)
308  : BC_TumbleTextBox(subwindow,
309         (int64_t)pwindow->thread->preferences->brender_fragment,
310         (int64_t)1, (int64_t)65535, x, y, xS(100))
311 {
312         this->pwindow = pwindow;
313 }
314 int PrefsBRenderFragment::handle_event()
315 {
316         pwindow->thread->preferences->brender_fragment = atol(get_text());
317         return 1;
318 }
319
320 CICacheSize::CICacheSize(int x, int y,
321         PreferencesWindow *pwindow, PerformancePrefs *subwindow)
322  : BC_TumbleTextBox(subwindow,
323         (int64_t)pwindow->thread->preferences->cache_size / 0x100000,
324         (int64_t)MIN_CACHE_SIZE / 0x100000,
325         (int64_t)MAX_CACHE_SIZE / 0x100000,
326         x, y, xS(100))
327 {
328         this->pwindow = pwindow;
329         set_increment(1);
330 }
331
332 int CICacheSize::handle_event()
333 {
334         int64_t result;
335         result = (int64_t)atol(get_text()) * 0x100000;
336         CLAMP(result, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
337         pwindow->thread->preferences->cache_size = result;
338         return 0;
339 }
340
341 CacheTransitions::CacheTransitions(int x, int y,
342         PreferencesWindow *pwindow, PerformancePrefs *subwindow)
343  : BC_CheckBox(x, y, pwindow->thread->preferences->cache_transitions,
344         _("Cache Transitions"))
345 {
346         this->pwindow = pwindow;
347 }
348
349 int CacheTransitions::handle_event()
350 {
351         pwindow->thread->preferences->cache_transitions = get_value();
352         return 0;
353 }
354
355
356 PrefsUseHWDev::PrefsUseHWDev(PreferencesWindow *pwindow,
357                 PerformancePrefs *subwindow, int x, int y)
358  : BC_PopupTextBox(subwindow,0,0,x,y,xS(100),yS(80),LISTBOX_TEXT)
359 {
360         this->pwindow = pwindow;
361 }
362
363 void PrefsUseHWDev::create_objects()
364 {
365         BC_PopupTextBox::create_objects();
366         set_tooltip(_("vdpau - Nvidia, Nouveau\n"
367                 "vaapi - Broadcom, Intel HD graphics, Amdgpu, Radeon\n"
368                 "cuda  - Nvidia + Cuda SDK"));
369         hw_dev_names.append(new BC_ListBoxItem(_("none")));
370 #ifdef HAVE_VAAPI
371         hw_dev_names.append(new BC_ListBoxItem("vaapi"));
372 #endif
373 #ifdef HAVE_VDPAU
374         hw_dev_names.append(new BC_ListBoxItem("vdpau"));
375 #endif
376 #ifdef HAVE_NV
377         hw_dev_names.append(new BC_ListBoxItem("cuda"));
378 #endif
379         update_list(&hw_dev_names);
380         update(&pwindow->thread->preferences->use_hw_dev[0]);
381 }
382
383 int PrefsUseHWDev::handle_event()
384 {
385         strncpy(&pwindow->thread->preferences->use_hw_dev[0],
386                 get_text(), sizeof(pwindow->thread->preferences->use_hw_dev));
387         return 1;
388 }
389
390 PrefsRenderPreroll::PrefsRenderPreroll(PreferencesWindow *pwindow,
391                 PerformancePrefs *subwindow, int x, int y)
392  : BC_TumbleTextBox(subwindow,
393         (float)pwindow->thread->preferences->render_preroll,
394         0.f, 100.f, x, y, xS(100))
395 {
396         this->pwindow = pwindow;
397         set_increment(0.1);
398 }
399 PrefsRenderPreroll::~PrefsRenderPreroll()
400 {
401 }
402 int PrefsRenderPreroll::handle_event()
403 {
404         pwindow->thread->preferences->render_preroll = atof(get_text());
405         return 1;
406 }
407
408
409 PrefsBRenderPreroll::PrefsBRenderPreroll(PreferencesWindow *pwindow,
410                 PerformancePrefs *subwindow,
411                 int x,
412                 int y)
413  : BC_TumbleTextBox(subwindow,
414         (int64_t)pwindow->thread->preferences->brender_preroll,
415         (int64_t)0, (int64_t)100, x, y, xS(100))
416 {
417         this->pwindow = pwindow;
418 }
419 int PrefsBRenderPreroll::handle_event()
420 {
421         pwindow->thread->preferences->brender_preroll = atol(get_text());
422         return 1;
423 }
424
425
426 PrefsRenderFarm::PrefsRenderFarm(PreferencesWindow *pwindow, int x, int y)
427  : BC_CheckBox(x,
428         y,
429         pwindow->thread->preferences->use_renderfarm,
430         _("Use render farm"))
431 {
432         this->pwindow = pwindow;
433 // *** CONTEXT_HELP ***
434         context_help_set_keyword("Render Farm section");
435 }
436 PrefsRenderFarm::~PrefsRenderFarm()
437 {
438 }
439 int PrefsRenderFarm::handle_event()
440 {
441         pwindow->thread->preferences->use_renderfarm = get_value();
442         return 1;
443 }
444
445
446 PrefsForceUniprocessor::PrefsForceUniprocessor(PreferencesWindow *pwindow, int x, int y)
447  : BC_CheckBox(x,
448         y,
449         pwindow->thread->preferences->force_uniprocessor,
450         _("Force single processor use"))
451 {
452         this->pwindow = pwindow;
453 // *** CONTEXT_HELP ***
454         context_help_set_keyword("Performance section");
455 }
456 PrefsForceUniprocessor::~PrefsForceUniprocessor()
457 {
458 }
459 int PrefsForceUniprocessor::handle_event()
460 {
461         pwindow->thread->preferences->force_uniprocessor = get_value();
462         return 1;
463 }
464
465
466
467 PrefsRenderFarmConsolidate::PrefsRenderFarmConsolidate(PreferencesWindow *pwindow, int x, int y)
468  : BC_CheckBox(x,
469         y,
470         pwindow->thread->preferences->renderfarm_consolidate,
471         _("Consolidate output files on completion"))
472 {
473         this->pwindow = pwindow;
474 }
475 PrefsRenderFarmConsolidate::~PrefsRenderFarmConsolidate()
476 {
477 }
478 int PrefsRenderFarmConsolidate::handle_event()
479 {
480         pwindow->thread->preferences->renderfarm_consolidate = get_value();
481         return 1;
482 }
483
484
485 PrefsRenderFarmPort::PrefsRenderFarmPort(PreferencesWindow *pwindow,
486         PerformancePrefs *subwindow,
487         int x,
488         int y)
489  : BC_TumbleTextBox(subwindow,
490         (int64_t)pwindow->thread->preferences->renderfarm_port,
491         (int64_t)1, (int64_t)65535, x, y, xS(100))
492 {
493         this->pwindow = pwindow;
494 }
495
496 PrefsRenderFarmPort::~PrefsRenderFarmPort()
497 {
498 }
499
500 int PrefsRenderFarmPort::handle_event()
501 {
502         pwindow->thread->preferences->renderfarm_port = atol(get_text());
503         return 1;
504 }
505
506
507
508 PrefsRenderFarmNodes::PrefsRenderFarmNodes(PreferencesWindow *pwindow,
509         PerformancePrefs *subwindow, int x, int y)
510  : BC_ListBox(x, y, xS(340), yS(230), LISTBOX_TEXT, 0,0,0,1, 0,0, LISTBOX_MULTIPLE)
511 {
512         for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i ) {
513                 titles[i] = _(default_titles[i]);
514                 widths[i] = xS(default_widths[i]);
515         }
516         update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
517                 0, 0, -1, 0, 0);
518         this->subwindow = subwindow;
519         this->pwindow = pwindow;
520 }
521 PrefsRenderFarmNodes::~PrefsRenderFarmNodes()
522 {
523 }
524
525 int PrefsRenderFarmNodes::column_resize_event()
526 {
527         for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i )
528                 widths[i] = get_column_width(i);
529         return 1;
530 }
531
532 int PrefsRenderFarmNodes::handle_event()
533 {
534 SET_TRACE
535         if(get_selection_number(0, 0) >= 0)
536         {
537                 subwindow->hot_node = get_selection_number(1, 0);
538                 subwindow->edit_node->update(get_selection(1, 0)->get_text());
539                 const char *text = get_selection(2, 0)->get_text();
540                 subwindow->edit_port->update(text);
541                 pwindow->thread->preferences->renderfarm_port = atol(text);
542                 if(get_cursor_x() < widths[0])
543                 {
544                         pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node] =
545                                 !pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node];
546                         subwindow->generate_node_list();
547                         subwindow->update_node_list();
548                 }
549         }
550         else
551         {
552                 subwindow->hot_node = -1;
553                 subwindow->edit_node->update("");
554         }
555 SET_TRACE
556         return 1;
557 }
558 int PrefsRenderFarmNodes::selection_changed()
559 {
560         handle_event();
561         return 1;
562 }
563
564
565 PrefsRenderFarmEditNode::PrefsRenderFarmEditNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
566  : BC_TextBox(x, y, xS(240), 1, "")
567 {
568         this->pwindow = pwindow;
569         this->subwindow = subwindow;
570 }
571
572 PrefsRenderFarmEditNode::~PrefsRenderFarmEditNode()
573 {
574 }
575
576 int PrefsRenderFarmEditNode::handle_event()
577 {
578         return 1;
579 }
580
581
582 PrefsRenderFarmNewNode::PrefsRenderFarmNewNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
583  : BC_GenericButton(x, y, _("Add Nodes"))
584 {
585         this->pwindow = pwindow;
586         this->subwindow = subwindow;
587 // *** CONTEXT_HELP ***
588         context_help_set_keyword("Render Farm Menu");
589 }
590 PrefsRenderFarmNewNode::~PrefsRenderFarmNewNode()
591 {
592 }
593 int PrefsRenderFarmNewNode::handle_event()
594 {
595         const char *name = subwindow->edit_node->get_text();
596         char *cp = (char*)subwindow->edit_port->get_text();
597         int64_t start_port = strtol(cp, &cp, 0), end_port = start_port;
598         while( isspace(*cp) ) ++cp;
599         if( *cp++ == '-' )
600                 end_port = strtol(cp, &cp, 0);
601         for( int port=start_port; port<=end_port; ++port ) {
602                 pwindow->thread->preferences->add_node(name, port, 1, 0.0);
603         }
604         pwindow->thread->preferences->renderfarm_port = end_port;
605         subwindow->edit_port->update(end_port);
606         pwindow->thread->preferences->reset_rates();
607         subwindow->generate_node_list();
608         subwindow->update_node_list();
609         subwindow->hot_node = -1;
610         return 1;
611 }
612
613
614 PrefsRenderFarmReplaceNode::PrefsRenderFarmReplaceNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
615  : BC_GenericButton(x, y, _("Apply Changes"))
616 {
617         this->pwindow = pwindow;
618         this->subwindow = subwindow;
619 // *** CONTEXT_HELP ***
620         context_help_set_keyword("Render Farm Menu");
621 }
622 PrefsRenderFarmReplaceNode::~PrefsRenderFarmReplaceNode()
623 {
624 }
625 int PrefsRenderFarmReplaceNode::handle_event()
626 {
627         if(subwindow->hot_node >= 0)
628         {
629                 pwindow->thread->preferences->edit_node(subwindow->hot_node,
630                         subwindow->edit_node->get_text(),
631                         pwindow->thread->preferences->renderfarm_port,
632                         pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node]);
633                 subwindow->generate_node_list();
634                 subwindow->update_node_list();
635         }
636         return 1;
637 }
638
639
640 PrefsRenderFarmDelNode::PrefsRenderFarmDelNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
641  : BC_GenericButton(x, y, _("Delete Nodes"))
642 {
643         this->pwindow = pwindow;
644         this->subwindow = subwindow;
645 // *** CONTEXT_HELP ***
646         context_help_set_keyword("Render Farm Menu");
647 }
648 PrefsRenderFarmDelNode::~PrefsRenderFarmDelNode()
649 {
650 }
651 int PrefsRenderFarmDelNode::handle_event()
652 {
653         ArrayList<BC_ListBoxItem *> &item_list = subwindow->nodes[0];
654         for( int i=item_list.size(); --i>=0; ) {
655                 if( !item_list[i]->get_selected() ) continue;
656                 pwindow->thread->preferences->delete_node(i);
657         }
658         subwindow->generate_node_list();
659         subwindow->update_node_list();
660         subwindow->hot_node = -1;
661         return 1;
662 }
663
664
665 PrefsRenderFarmSortNodes::PrefsRenderFarmSortNodes(PreferencesWindow *pwindow,
666         PerformancePrefs *subwindow,
667         int x,
668         int y)
669  : BC_GenericButton(x, y, _("Sort nodes"))
670 {
671         this->pwindow = pwindow;
672         this->subwindow = subwindow;
673 // *** CONTEXT_HELP ***
674         context_help_set_keyword("Render Farm Menu");
675 }
676
677 PrefsRenderFarmSortNodes::~PrefsRenderFarmSortNodes()
678 {
679 }
680
681 int PrefsRenderFarmSortNodes::handle_event()
682 {
683         pwindow->thread->preferences->sort_nodes();
684         subwindow->generate_node_list();
685         subwindow->update_node_list();
686         subwindow->hot_node = -1;
687         return 1;
688 }
689
690
691 PrefsRenderFarmReset::PrefsRenderFarmReset(PreferencesWindow *pwindow,
692         PerformancePrefs *subwindow, int x, int y)
693  : BC_GenericButton(x, y, _("Reset rates"))
694 {
695         this->pwindow = pwindow;
696         this->subwindow = subwindow;
697 // *** CONTEXT_HELP ***
698         context_help_set_keyword("Render Farm Menu");
699 }
700
701 int PrefsRenderFarmReset::handle_event()
702 {
703         pwindow->thread->preferences->reset_rates();
704         subwindow->generate_node_list();
705         subwindow->update_node_list();
706
707         char string[BCTEXTLEN];
708         sprintf(string,
709                 _(MASTER_NODE_FRAMERATE_TEXT),
710                 pwindow->thread->preferences->local_rate);
711         subwindow->master_rate->update(string);
712         subwindow->hot_node = -1;
713         return 1;
714 }
715
716
717 PrefsProjectSMP::PrefsProjectSMP(PreferencesWindow *pwindow,
718                 PerformancePrefs *subwindow, int x, int y)
719  : BC_TumbleTextBox(subwindow,
720         (int64_t)pwindow->thread->preferences->project_smp,
721         (int64_t)1, (int64_t)100, x, y, xS(100))
722 {
723         this->pwindow = pwindow;
724 }
725 PrefsProjectSMP::~PrefsProjectSMP()
726 {
727 }
728 int PrefsProjectSMP::handle_event()
729 {
730         pwindow->thread->preferences->project_smp = atol(get_text());
731         return 1;
732 }
733
734
735 PrefsRenderFarmJobs::PrefsRenderFarmJobs(PreferencesWindow *pwindow,
736                 PerformancePrefs *subwindow,
737                 int x,
738                 int y)
739  : BC_TumbleTextBox(subwindow,
740         (int64_t)pwindow->thread->preferences->renderfarm_job_count,
741         (int64_t)1, (int64_t)100, x, y, xS(100))
742 {
743         this->pwindow = pwindow;
744 }
745 PrefsRenderFarmJobs::~PrefsRenderFarmJobs()
746 {
747 }
748 int PrefsRenderFarmJobs::handle_event()
749 {
750         pwindow->thread->preferences->renderfarm_job_count = atol(get_text());
751         return 1;
752 }
753
754
755 PrefsRenderFarmMountpoint::PrefsRenderFarmMountpoint(PreferencesWindow *pwindow,
756                 PerformancePrefs *subwindow, int x, int y)
757  : BC_TextBox(x, y, xS(100), 1,
758         pwindow->thread->preferences->renderfarm_mountpoint)
759 {
760         this->pwindow = pwindow;
761         this->subwindow = subwindow;
762 }
763 PrefsRenderFarmMountpoint::~PrefsRenderFarmMountpoint()
764 {
765 }
766 int PrefsRenderFarmMountpoint::handle_event()
767 {
768         strcpy(pwindow->thread->preferences->renderfarm_mountpoint, get_text());
769         return 1;
770 }
771
772
773 PrefsRenderFarmVFS::PrefsRenderFarmVFS(PreferencesWindow *pwindow,
774         PerformancePrefs *subwindow, int x, int y)
775  : BC_CheckBox(x, y, pwindow->thread->preferences->renderfarm_vfs,
776         _("Use virtual filesystem"))
777 {
778         this->pwindow = pwindow;
779         this->subwindow = subwindow;
780 }
781
782 int PrefsRenderFarmVFS::handle_event()
783 {
784         pwindow->thread->preferences->renderfarm_vfs = get_value();
785         return 1;
786 }
787
788
789 PrefsRenderFarmWatchdog::PrefsRenderFarmWatchdog(PreferencesWindow *pwindow,
790                 PerformancePrefs *subwindow, int x, int y)
791  : BC_TumbleTextBox(subwindow,
792         (int64_t)pwindow->thread->preferences->renderfarm_watchdog_timeout,
793         (int64_t)0, (int64_t)1000, x, y, xS(100))
794 {
795         this->pwindow = pwindow;
796         set_increment(15);
797 }
798
799 int PrefsRenderFarmWatchdog::handle_event()
800 {
801         pwindow->thread->preferences->renderfarm_watchdog_timeout = atol(get_text());
802         return 1;
803 }
804
805