4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "bcsignals.h"
25 #include "edlsession.h"
26 #include "formattools.h"
29 #include "performanceprefs.h"
30 #include "preferences.h"
35 #define MASTER_NODE_FRAMERATE_TEXT "Master node framerate: %0.3f"
37 N_(MASTER_NODE_FRAMERATE_TEXT)
40 PerformancePrefs::PerformancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
41 : PreferencesDialog(mwindow, pwindow)
46 PerformancePrefs::~PerformancePrefs()
49 nodes[0].remove_all_objects();
50 nodes[1].remove_all_objects();
51 nodes[2].remove_all_objects();
52 nodes[3].remove_all_objects();
55 void PerformancePrefs::create_objects()
57 int xs5 = xS(5), xs10 = xS(10);
58 int ys5 = yS(5), ys10 = yS(10), ys20 = yS(20), ys30 = yS(30), ys35 = yS(35);
60 int xmargin2 = xS(180);
61 int xmargin3 = xS(260);
62 int xmargin4 = xS(420);
63 char string[BCTEXTLEN];
64 BC_Resources *resources = BC_WindowBase::get_resources();
71 int xmargin1 = x = mwindow->theme->preferencesoptions_x;
72 y = mwindow->theme->preferencesoptions_y;
75 win = add_subwindow(new BC_Title(x, y + ys5, _("Cache size (MB):"), MEDIUMFONT, resources->text_default));
77 int x1 = x + xmargin4;
78 win = add_subwindow(new BC_Title(x1, y + ys5, _("Use HW Device:")));
79 x1 += win->get_w() + xs5;
80 PrefsUseHWDev *use_hw_dev = new PrefsUseHWDev(pwindow, this, x1, y);
81 use_hw_dev->create_objects();
84 win = add_subwindow(new BC_Title(x, y + ys5, _("Seconds to preroll renders:")));
85 if((curw = win->get_w()) > maxw)
89 cache_size = new CICacheSize(maxw, y0, pwindow, this);
90 cache_size->create_objects();
92 add_subwindow(new BC_Title(x, y + ys5, _("Seconds to preroll renders:")));
93 PrefsRenderPreroll *preroll = new PrefsRenderPreroll(pwindow, this, maxw, y1);
94 preroll->create_objects();
98 BC_Title *smp_title = new BC_Title(x1, y + ys5, _("Project SMP cpus:"));
99 add_subwindow(smp_title);
100 x1 += smp_title->get_w() + xs5;
101 PrefsProjectSMP *proj_smp = new PrefsProjectSMP(pwindow, this, x1, y);
102 proj_smp->create_objects();
104 PrefsForceUniprocessor *force_1cpu = new PrefsForceUniprocessor(pwindow, x, y);
105 add_subwindow(force_1cpu);
108 // Background rendering
109 add_subwindow(new BC_Bar(xs5, y, get_w() - xs10));
113 add_subwindow(new BC_Title(x, y, _("Background Rendering (Video only)"), LARGEFONT, resources->text_default));
116 win = add_subwindow(new PrefsUseBRender(pwindow, x, y));
118 y += win->get_h() + ys10;
119 win = add_subwindow(new BC_Title(x, y, _("Frames per background rendering job:")));
120 y += win->get_h() + ys5;
121 PrefsBRenderFragment *brender_fragment = new PrefsBRenderFragment(pwindow, this,
123 brender_fragment->create_objects();
124 y += brender_fragment->get_h() + ys5;
125 win = add_subwindow(new BC_Title(x, y, _("Frames to preroll background:")));
126 y += win->get_h() + ys5;
127 PrefsBRenderPreroll *bpreroll = new PrefsBRenderPreroll(pwindow, this,
128 x + xmargin3, y + ys5);
129 bpreroll->create_objects();
130 y += bpreroll->get_h() + ys20;
133 add_subwindow(new BC_Title(x, y1, _("Output for background rendering:")));
135 brender_tools = new FormatTools(mwindow, this,
136 pwindow->thread->preferences->brender_asset);
137 brender_tools->create_objects(x, y1,
138 0, // Include tools for audio
139 1, // Include tools for video
140 0, // Include checkbox for audio
141 0, // Include checkbox for video
144 0, // Select compressors to be offered
145 0, // Prompt for recording options
146 0, // prompt for use labels
147 1); // Supply file formats for background rendering
152 add_subwindow(new BC_Bar(xs5, y, get_w() - xs10));
154 add_subwindow(new BC_Title(x, y, _("Render Farm"), LARGEFONT, resources->text_default));
155 x1 = get_w() - BC_GenericButton::calculate_w(this, _("Reset rates")) - x;
156 add_subwindow(new PrefsRenderFarmReset(pwindow, this, x1, y));
158 BC_Title *node_title = new BC_Title(x1, y, _("Nodes:"));
159 add_subwindow(node_title);
160 x1 += node_title->get_w() + xS(15);
161 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
162 pwindow->thread->preferences->local_rate);
163 add_subwindow(master_rate = new BC_Title(x1, y, string));
164 add_subwindow(node_list = new PrefsRenderFarmNodes(pwindow, this, x + xmargin4, y+=yS(25)));
165 add_subwindow(new PrefsRenderFarm(pwindow, x, y+=ys5));
166 add_subwindow(new BC_Title(x, y+=ys30, _("Hostname:")));
167 add_subwindow(new BC_Title(x + xmargin3, y, _("Port:")));
168 add_subwindow(edit_node = new PrefsRenderFarmEditNode(pwindow, this, x, y+=yS(25)));
169 edit_port = new PrefsRenderFarmPort(pwindow, this, x+xmargin3, y);
170 edit_port->create_objects();
172 add_subwindow(new PrefsRenderFarmReplaceNode(pwindow, this, x, y+=ys30));
173 add_subwindow(new PrefsRenderFarmNewNode(pwindow, this, x+xmargin2, y));
174 add_subwindow(new PrefsRenderFarmSortNodes(pwindow, this, x, y+=ys30));
175 add_subwindow(new PrefsRenderFarmDelNode(pwindow, this, x+xmargin2, y));
176 add_subwindow(new BC_Title(x, y+=ys35, _("Client Watchdog Timeout:")));
177 renderfarm_watchdog = new PrefsRenderFarmWatchdog(pwindow, this, x+xmargin3, y-ys5);
178 renderfarm_watchdog->create_objects();
179 add_subwindow(new BC_Title(x, y+=ys35, _("Total jobs to create:")));
180 PrefsRenderFarmJobs *jobs = new PrefsRenderFarmJobs(pwindow, this,
181 x + xmargin3, y-ys5);
182 jobs->create_objects();
183 y += jobs->get_h() + ys5;
184 win = add_subwindow(new BC_Title(x, y,
185 _("(overridden if new file at each label is checked)")));
186 // y += win->get_h() + ys5;
187 // add_subwindow(new PrefsRenderFarmVFS(pwindow, this, x, y));
188 // add_subwindow(new BC_Title(x, y,
189 // _("Filesystem prefix on remote nodes:")));
190 // add_subwindow(new PrefsRenderFarmMountpoint(pwindow, this, x + xmargin3, y));
194 void PerformancePrefs::generate_node_list()
196 int selected_row = node_list ? node_list->get_selection_number(0, 0) : -1;
198 for(int i = 0; i < TOTAL_COLUMNS; i++)
199 nodes[i].remove_all_objects();
202 i < pwindow->thread->preferences->renderfarm_nodes.size();
205 BC_ListBoxItem *item;
206 nodes[ENABLED_COLUMN].append(item = new BC_ListBoxItem(
207 (char*)(pwindow->thread->preferences->renderfarm_enabled.get(i) ? "X" : " ")));
208 if(i == selected_row) item->set_selected(1);
210 nodes[HOSTNAME_COLUMN].append(item = new BC_ListBoxItem(
211 pwindow->thread->preferences->renderfarm_nodes.get(i)));
212 if(i == selected_row) item->set_selected(1);
214 char string[BCTEXTLEN];
215 sprintf(string, "%d", pwindow->thread->preferences->renderfarm_ports.get(i));
216 nodes[PORT_COLUMN].append(item = new BC_ListBoxItem(string));
217 if(i == selected_row) item->set_selected(1);
219 sprintf(string, "%0.3f", pwindow->thread->preferences->renderfarm_rate.get(i));
220 nodes[RATE_COLUMN].append(item = new BC_ListBoxItem(string));
221 if(i == selected_row) item->set_selected(1);
226 static const char *default_titles[] = {
227 N_("On"), N_("Hostname"), N_("Port"), N_("Framerate")
230 static int default_widths[] = {
235 void PerformancePrefs::update_node_list()
237 node_list->update_list();
240 void PrefsRenderFarmNodes::update_list()
242 update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
243 get_xposition(), get_yposition(), get_selection_number(0, 0));
247 void PerformancePrefs::update_rates()
249 //printf("PerformancePrefs::update_rates %d\n", __LINE__);
250 char string[BCTEXTLEN];
252 i < mwindow->preferences->renderfarm_rate.size();
255 if(i < nodes[RATE_COLUMN].size())
257 sprintf(string, "%0.3f", mwindow->preferences->renderfarm_rate.get(i));
258 nodes[RATE_COLUMN].get(i)->set_text(string);
262 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
263 mwindow->preferences->local_rate);
264 master_rate->update(string);
270 PrefsUseBRender::PrefsUseBRender(PreferencesWindow *pwindow,
275 pwindow->thread->preferences->use_brender,
276 _("Use background rendering"))
278 this->pwindow = pwindow;
281 int PrefsUseBRender::handle_event()
283 pwindow->thread->redraw_overlays = 1;
284 pwindow->thread->redraw_times = 1;
285 pwindow->thread->preferences->use_brender = get_value();
290 PrefsBRenderFragment::PrefsBRenderFragment(PreferencesWindow *pwindow,
291 PerformancePrefs *subwindow, int x, int y)
292 : BC_TumbleTextBox(subwindow,
293 (int64_t)pwindow->thread->preferences->brender_fragment,
294 (int64_t)1, (int64_t)65535, x, y, xS(100))
296 this->pwindow = pwindow;
298 int PrefsBRenderFragment::handle_event()
300 pwindow->thread->preferences->brender_fragment = atol(get_text());
304 CICacheSize::CICacheSize(int x, int y,
305 PreferencesWindow *pwindow, PerformancePrefs *subwindow)
306 : BC_TumbleTextBox(subwindow,
307 (int64_t)pwindow->thread->preferences->cache_size / 0x100000,
308 (int64_t)MIN_CACHE_SIZE / 0x100000,
309 (int64_t)MAX_CACHE_SIZE / 0x100000,
312 this->pwindow = pwindow;
316 int CICacheSize::handle_event()
319 result = (int64_t)atol(get_text()) * 0x100000;
320 CLAMP(result, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
321 pwindow->thread->preferences->cache_size = result;
326 PrefsUseHWDev::PrefsUseHWDev(PreferencesWindow *pwindow,
327 PerformancePrefs *subwindow, int x, int y)
328 : BC_PopupTextBox(subwindow,0,0,x,y,xS(100),yS(80),LISTBOX_TEXT)
330 this->pwindow = pwindow;
333 void PrefsUseHWDev::create_objects()
335 BC_PopupTextBox::create_objects();
336 set_tooltip(_("vdpau - Nvidia, Nouveau\n"
337 "vaapi - Broadcom, Intel HD graphics, Amdgpu, Radeon\n"
338 "cuda - Nvidia + Cuda SDK"));
339 hw_dev_names.append(new BC_ListBoxItem(_("none")));
341 hw_dev_names.append(new BC_ListBoxItem("vaapi"));
344 hw_dev_names.append(new BC_ListBoxItem("vdpau"));
347 hw_dev_names.append(new BC_ListBoxItem("cuda"));
349 update_list(&hw_dev_names);
350 update(&pwindow->thread->preferences->use_hw_dev[0]);
353 int PrefsUseHWDev::handle_event()
355 strncpy(&pwindow->thread->preferences->use_hw_dev[0],
356 get_text(), sizeof(pwindow->thread->preferences->use_hw_dev));
360 PrefsRenderPreroll::PrefsRenderPreroll(PreferencesWindow *pwindow,
361 PerformancePrefs *subwindow, int x, int y)
362 : BC_TumbleTextBox(subwindow,
363 (float)pwindow->thread->preferences->render_preroll,
364 0.f, 100.f, x, y, xS(100))
366 this->pwindow = pwindow;
369 PrefsRenderPreroll::~PrefsRenderPreroll()
372 int PrefsRenderPreroll::handle_event()
374 pwindow->thread->preferences->render_preroll = atof(get_text());
379 PrefsBRenderPreroll::PrefsBRenderPreroll(PreferencesWindow *pwindow,
380 PerformancePrefs *subwindow,
383 : BC_TumbleTextBox(subwindow,
384 (int64_t)pwindow->thread->preferences->brender_preroll,
385 (int64_t)0, (int64_t)100, x, y, xS(100))
387 this->pwindow = pwindow;
389 int PrefsBRenderPreroll::handle_event()
391 pwindow->thread->preferences->brender_preroll = atol(get_text());
396 PrefsRenderFarm::PrefsRenderFarm(PreferencesWindow *pwindow, int x, int y)
399 pwindow->thread->preferences->use_renderfarm,
400 _("Use render farm"))
402 this->pwindow = pwindow;
404 PrefsRenderFarm::~PrefsRenderFarm()
407 int PrefsRenderFarm::handle_event()
409 pwindow->thread->preferences->use_renderfarm = get_value();
414 PrefsForceUniprocessor::PrefsForceUniprocessor(PreferencesWindow *pwindow, int x, int y)
417 pwindow->thread->preferences->force_uniprocessor,
418 _("Force single processor use"))
420 this->pwindow = pwindow;
422 PrefsForceUniprocessor::~PrefsForceUniprocessor()
425 int PrefsForceUniprocessor::handle_event()
427 pwindow->thread->preferences->force_uniprocessor = get_value();
433 PrefsRenderFarmConsolidate::PrefsRenderFarmConsolidate(PreferencesWindow *pwindow, int x, int y)
436 pwindow->thread->preferences->renderfarm_consolidate,
437 _("Consolidate output files on completion"))
439 this->pwindow = pwindow;
441 PrefsRenderFarmConsolidate::~PrefsRenderFarmConsolidate()
444 int PrefsRenderFarmConsolidate::handle_event()
446 pwindow->thread->preferences->renderfarm_consolidate = get_value();
451 PrefsRenderFarmPort::PrefsRenderFarmPort(PreferencesWindow *pwindow,
452 PerformancePrefs *subwindow,
455 : BC_TumbleTextBox(subwindow,
456 (int64_t)pwindow->thread->preferences->renderfarm_port,
457 (int64_t)1, (int64_t)65535, x, y, xS(100))
459 this->pwindow = pwindow;
462 PrefsRenderFarmPort::~PrefsRenderFarmPort()
466 int PrefsRenderFarmPort::handle_event()
468 pwindow->thread->preferences->renderfarm_port = atol(get_text());
474 PrefsRenderFarmNodes::PrefsRenderFarmNodes(PreferencesWindow *pwindow,
475 PerformancePrefs *subwindow, int x, int y)
476 : BC_ListBox(x, y, xS(340), yS(230), LISTBOX_TEXT, 0,0,0,1, 0,0, LISTBOX_MULTIPLE)
478 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i ) {
479 titles[i] = _(default_titles[i]);
480 widths[i] = xS(default_widths[i]);
482 update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
484 this->subwindow = subwindow;
485 this->pwindow = pwindow;
487 PrefsRenderFarmNodes::~PrefsRenderFarmNodes()
491 int PrefsRenderFarmNodes::column_resize_event()
493 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i )
494 widths[i] = get_column_width(i);
498 int PrefsRenderFarmNodes::handle_event()
501 if(get_selection_number(0, 0) >= 0)
503 subwindow->hot_node = get_selection_number(1, 0);
504 subwindow->edit_node->update(get_selection(1, 0)->get_text());
505 const char *text = get_selection(2, 0)->get_text();
506 subwindow->edit_port->update(text);
507 pwindow->thread->preferences->renderfarm_port = atol(text);
508 if(get_cursor_x() < widths[0])
510 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node] =
511 !pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node];
512 subwindow->generate_node_list();
513 subwindow->update_node_list();
518 subwindow->hot_node = -1;
519 subwindow->edit_node->update("");
524 int PrefsRenderFarmNodes::selection_changed()
531 PrefsRenderFarmEditNode::PrefsRenderFarmEditNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
532 : BC_TextBox(x, y, xS(240), 1, "")
534 this->pwindow = pwindow;
535 this->subwindow = subwindow;
538 PrefsRenderFarmEditNode::~PrefsRenderFarmEditNode()
542 int PrefsRenderFarmEditNode::handle_event()
548 PrefsRenderFarmNewNode::PrefsRenderFarmNewNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
549 : BC_GenericButton(x, y, _("Add Nodes"))
551 this->pwindow = pwindow;
552 this->subwindow = subwindow;
554 PrefsRenderFarmNewNode::~PrefsRenderFarmNewNode()
557 int PrefsRenderFarmNewNode::handle_event()
559 const char *name = subwindow->edit_node->get_text();
560 char *cp = (char*)subwindow->edit_port->get_text();
561 int64_t start_port = strtol(cp, &cp, 0), end_port = start_port;
562 while( isspace(*cp) ) ++cp;
564 end_port = strtol(cp, &cp, 0);
565 for( int port=start_port; port<=end_port; ++port ) {
566 pwindow->thread->preferences->add_node(name, port, 1, 0.0);
568 pwindow->thread->preferences->renderfarm_port = end_port;
569 subwindow->edit_port->update(end_port);
570 pwindow->thread->preferences->reset_rates();
571 subwindow->generate_node_list();
572 subwindow->update_node_list();
573 subwindow->hot_node = -1;
578 PrefsRenderFarmReplaceNode::PrefsRenderFarmReplaceNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
579 : BC_GenericButton(x, y, _("Apply Changes"))
581 this->pwindow = pwindow;
582 this->subwindow = subwindow;
584 PrefsRenderFarmReplaceNode::~PrefsRenderFarmReplaceNode()
587 int PrefsRenderFarmReplaceNode::handle_event()
589 if(subwindow->hot_node >= 0)
591 pwindow->thread->preferences->edit_node(subwindow->hot_node,
592 subwindow->edit_node->get_text(),
593 pwindow->thread->preferences->renderfarm_port,
594 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node]);
595 subwindow->generate_node_list();
596 subwindow->update_node_list();
602 PrefsRenderFarmDelNode::PrefsRenderFarmDelNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
603 : BC_GenericButton(x, y, _("Delete Nodes"))
605 this->pwindow = pwindow;
606 this->subwindow = subwindow;
608 PrefsRenderFarmDelNode::~PrefsRenderFarmDelNode()
611 int PrefsRenderFarmDelNode::handle_event()
613 ArrayList<BC_ListBoxItem *> &item_list = subwindow->nodes[0];
614 for( int i=item_list.size(); --i>=0; ) {
615 if( !item_list[i]->get_selected() ) continue;
616 pwindow->thread->preferences->delete_node(i);
618 subwindow->generate_node_list();
619 subwindow->update_node_list();
620 subwindow->hot_node = -1;
625 PrefsRenderFarmSortNodes::PrefsRenderFarmSortNodes(PreferencesWindow *pwindow,
626 PerformancePrefs *subwindow,
629 : BC_GenericButton(x, y, _("Sort nodes"))
631 this->pwindow = pwindow;
632 this->subwindow = subwindow;
635 PrefsRenderFarmSortNodes::~PrefsRenderFarmSortNodes()
639 int PrefsRenderFarmSortNodes::handle_event()
641 pwindow->thread->preferences->sort_nodes();
642 subwindow->generate_node_list();
643 subwindow->update_node_list();
644 subwindow->hot_node = -1;
649 PrefsRenderFarmReset::PrefsRenderFarmReset(PreferencesWindow *pwindow,
650 PerformancePrefs *subwindow, int x, int y)
651 : BC_GenericButton(x, y, _("Reset rates"))
653 this->pwindow = pwindow;
654 this->subwindow = subwindow;
657 int PrefsRenderFarmReset::handle_event()
659 pwindow->thread->preferences->reset_rates();
660 subwindow->generate_node_list();
661 subwindow->update_node_list();
663 char string[BCTEXTLEN];
665 _(MASTER_NODE_FRAMERATE_TEXT),
666 pwindow->thread->preferences->local_rate);
667 subwindow->master_rate->update(string);
668 subwindow->hot_node = -1;
673 PrefsProjectSMP::PrefsProjectSMP(PreferencesWindow *pwindow,
674 PerformancePrefs *subwindow, int x, int y)
675 : BC_TumbleTextBox(subwindow,
676 (int64_t)pwindow->thread->preferences->project_smp,
677 (int64_t)1, (int64_t)100, x, y, xS(100))
679 this->pwindow = pwindow;
681 PrefsProjectSMP::~PrefsProjectSMP()
684 int PrefsProjectSMP::handle_event()
686 pwindow->thread->preferences->project_smp = atol(get_text());
691 PrefsRenderFarmJobs::PrefsRenderFarmJobs(PreferencesWindow *pwindow,
692 PerformancePrefs *subwindow,
695 : BC_TumbleTextBox(subwindow,
696 (int64_t)pwindow->thread->preferences->renderfarm_job_count,
697 (int64_t)1, (int64_t)100, x, y, xS(100))
699 this->pwindow = pwindow;
701 PrefsRenderFarmJobs::~PrefsRenderFarmJobs()
704 int PrefsRenderFarmJobs::handle_event()
706 pwindow->thread->preferences->renderfarm_job_count = atol(get_text());
711 PrefsRenderFarmMountpoint::PrefsRenderFarmMountpoint(PreferencesWindow *pwindow,
712 PerformancePrefs *subwindow, int x, int y)
713 : BC_TextBox(x, y, xS(100), 1,
714 pwindow->thread->preferences->renderfarm_mountpoint)
716 this->pwindow = pwindow;
717 this->subwindow = subwindow;
719 PrefsRenderFarmMountpoint::~PrefsRenderFarmMountpoint()
722 int PrefsRenderFarmMountpoint::handle_event()
724 strcpy(pwindow->thread->preferences->renderfarm_mountpoint, get_text());
729 PrefsRenderFarmVFS::PrefsRenderFarmVFS(PreferencesWindow *pwindow,
730 PerformancePrefs *subwindow, int x, int y)
731 : BC_CheckBox(x, y, pwindow->thread->preferences->renderfarm_vfs,
732 _("Use virtual filesystem"))
734 this->pwindow = pwindow;
735 this->subwindow = subwindow;
738 int PrefsRenderFarmVFS::handle_event()
740 pwindow->thread->preferences->renderfarm_vfs = get_value();
745 PrefsRenderFarmWatchdog::PrefsRenderFarmWatchdog(PreferencesWindow *pwindow,
746 PerformancePrefs *subwindow, int x, int y)
747 : BC_TumbleTextBox(subwindow,
748 (int64_t)pwindow->thread->preferences->renderfarm_watchdog_timeout,
749 (int64_t)0, (int64_t)1000, x, y, xS(100))
751 this->pwindow = pwindow;
755 int PrefsRenderFarmWatchdog::handle_event()
757 pwindow->thread->preferences->renderfarm_watchdog_timeout = atol(get_text());